Per pesante intendi dire che è molto complessa e richiede molta elaborazione del server oppure che contiene semplicemente molti dati?

Nel primo caso puoi creare una tabella con i soli risultati della query in questo modo il peso dell'elaborazione viene eseguito solo una volta al giorno e per ogni utente viene eseguita solamente una query di selezione "flat".

In entrambi i casi puoi utilizzare una layer di astrazione (es. ADODb), un framework (es. CakePHP) oppure una classe già pronto (vedi su PHP Classes etc.) che implementa già il sistema di caching. Con ADODb la risoluzione del tuo problema è molto semplice e lineare.