2010-07-26 2 views
6

Ho un po 'di SQL che assomiglia più o meno in questo modo:Caratteristiche prestazionali di T-SQL CTE

with InterestingObjects(ObjectID, OtherInformation, Whatever) as (
    select X.ObjectID, Y.OtherInformation, Z.Whatever 
    from X join Y join Z -- abbreviated for brevity 
) 

-- ...long query follows, which uses InterestingObjects in several more CTEs, 
-- and then uses those CTEs in a select statement at the end. 

quando l'eseguo, posso vedere nel piano di esecuzione che sembra essere in esecuzione della query in il CTE fondamentalmente ogni volta che si fa riferimento al CTE. Se invece creo una tabella temporanea #InterestingObjects e la utilizzo, ovviamente, esegue la query una volta, inserisce il risultato nella tabella temporanea e interroga da quel momento in poi. Nel mio caso particolare, ciò rende il tutto molto più veloce.

La mia domanda è: è sempre quello che posso aspettarmi dai CTE (non memoizzare i risultati in alcun modo, proprio come se stesse inserendo la query ovunque?) C'è un motivo per cui SQL Server non ha potuto ottimizzare questo meglio? Di solito sono impressionato da quanto sia intelligente l'ottimizzatore, ma sono sorpreso che non sia stato in grado di capirlo.

(edit: BTW, sto correndo questo su SQL Server R2 '08.)

+0

Utente StackOverflow Quassnoi http://stackoverflow.com/users/55159/quassnoi ha scritto un interessante articolo al riguardo. http://explainextended.com/2009/05/28/generating-xml-in-subqueries/ –

+0

Questo è interessante. Non sto operando sotto nessun vincolo come lui descrive (ad esempio, passando attraverso un ORM che non consente tabelle temporanee) quindi non vedo davvero perché il suo metodo è più bello delle tabelle temporali - e ovviamente se si codifica un piano hardcode così, è un grande costo di manutenzione quando si cambia la query. Ancora, una vista veramente utile su come il piano di esecuzione controlla questo comportamento. – alphabasic

risposta