Ho una query complessa che ho bisogno di utilizzare in una query successiva (in realtà la dichiarazione di aggiornamento). Ho provato ad usare sia un CTE che un tavolo temporaneo. Le prestazioni utilizzando il CTE sono orribili rispetto all'approccio alla tabella temporanea. È qualcosa come 15 secondi vs millisecondi. Per semplificare il test invece di unire la tabella CTE/Temp nella query successiva, ho semplicemente selezionato * da esso. In tal caso, eseguono lo stesso.Tabella SQL 2005 CTE vs TEMP Prestazioni quando utilizzato in join di altre tabelle
Ho esaminato il piano di esecuzione per entrambi gli approcci entrambi con i join nella query successiva e quindi semplicemente selezionare *. Con la semplice selezione i piani di query sono quasi gli stessi, ma con i join nella successiva selezionare i piani di query non lo sono. In particolare, la parte del piano di query per la creazione e il popolamento della tabella temporanea rimane invariata, mentre la parte del piano di query per la creazione e la compilazione del CTE cambia radicalmente quando viene successivamente utilizzata in una query con un join.
La mia domanda è perché il piano di query per la creazione e la popolazione del CTE cambia in base a come viene successivamente utilizzato mentre la tabella temporanea non lo è. Anche in quali scenari, quindi, un CTE produrrà prestazioni migliori rispetto a un tavolo temporaneo?
* Nota Ho utilizzato anche una variabile di tabella ed è paragonabile all'approccio alla tabella temporanea.
Grazie
Sì per materializzare! Un PK/IX nella definizione potrebbe essere carino. – crokusek