Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

C'è una differenza di prestazioni tra CTE , Sub-Query, Tabella temporanea o Variabile di tabella?

SQL è un linguaggio dichiarativo, non un linguaggio procedurale. Cioè, costruisci un'istruzione SQL per descrivere i risultati che desideri. Non stai dicendo al motore SQL come per fare il lavoro.

Come regola generale, è una buona idea lasciare che il motore SQL e l'ottimizzatore SQL trovino il miglior piano di query. Ci sono molti anni di lavoro per lo sviluppo di un motore SQL, quindi lascia che gli ingegneri facciano quello che sanno fare.

Naturalmente, ci sono situazioni in cui il piano di query non è ottimale. Quindi desideri utilizzare suggerimenti per le query, ristrutturare la query, aggiornare le statistiche, utilizzare tabelle temporanee, aggiungere indici e così via per ottenere prestazioni migliori.

Per quanto riguarda la tua domanda. Le prestazioni di CTE e sottoquery dovrebbero, in teoria, essere le stesse poiché entrambi forniscono le stesse informazioni a Query Optimizer. Una differenza è che un CTE utilizzato più di una volta potrebbe essere facilmente identificato e calcolato una volta. I risultati possono quindi essere archiviati e letti più volte. Sfortunatamente, SQL Server non sembra trarre vantaggio da questo metodo di ottimizzazione di base (potresti chiamare questa comune eliminazione di sottoquery).

Le tabelle temporanee sono una questione diversa, perché vengono fornite ulteriori indicazioni su come eseguire la query. Una delle principali differenze è che l'ottimizzatore può utilizzare le statistiche della tabella temporanea per stabilire il proprio piano di query. Ciò può comportare un aumento delle prestazioni. Inoltre, se si dispone di un CTE (sottoquery) complicato che viene utilizzato più di una volta, la memorizzazione in una tabella temporanea spesso darà un aumento delle prestazioni. La query viene eseguita una sola volta.

La risposta alla tua domanda è che devi giocare per ottenere le prestazioni che ti aspetti, in particolare per query complesse eseguite regolarmente. In un mondo ideale, Query Optimizer troverebbe il percorso di esecuzione perfetto. Anche se spesso accade, potresti riuscire a trovare un modo per ottenere prestazioni migliori.