Quali regole determinano quando SQL Server utilizza un CTE come "recinto di ottimizzazione"?


10

Qualche tempo fa, Brent Ozar ha pubblicato un post che descrive in dettaglio alcune delle differenze tra SQL Server e PostgreSQL:

Due differenze importanti tra SQL Server e PostgreSQL

Il primo punto ("I CTE sono recinzioni di ottimizzazione") ha attirato la mia attenzione, poiché è ovvio che nell'esempio fornito, SQL Server combina il CTE e la query principale insieme e lo ottimizza come una singola query (al contrario del comportamento opposto in PostgreSQL).

Tuttavia, questo comportamento sembra contrario agli esempi che ho visto in altri blog e corsi di formazione, in cui SQL Server considera il CTE come un recinto di ottimizzazione, che consente un migliore utilizzo degli indici, migliori prestazioni, ecc. Ad esempio:

Un modo migliore per selezionare la stella

Quindi, sembra che SQL Server "onori" il CTE come recinto di ottimizzazione SOMETIMES. Sono disponibili buone risorse che documentano l'elenco specifico di casi noti in cui SQL Server onorerà in modo affidabile il CTE come un recinto di ottimizzazione (o comportamento contrario)?

Risposte:


10

... elenco di casi noti in cui SQL Server onorerà in modo affidabile il CTE come un recinto di ottimizzazione

Qualsiasi elenco di questo tipo si baserebbe sul comportamento osservato, senza alcuna garanzia di affidabilità.

Query Optimizer di SQL Server non considera mai un'espressione di tabella comune come un recinto di ottimizzazione di per sé , sebbene alcune costruzioni siano chiaramente difficili da ottimizzare. I CTE ricorsivi ne sono un buon esempio.

I CTE sono trattati in modo molto simile alle viste / funzioni incorporate / sottoquery / tabelle derivate e integrati nella query. Qualsiasi comportamento osservato di "recinzione" dipende dal fatto che l'ottimizzatore non sia in grado o non decida di ottimizzare attraverso quel confine permeabile in linea di principio.

In generale, più semplice e "relazionale" è il CTE, più è probabile che l'ottimizzatore sarà in grado di spostare i bit.

Sono state suggerite funzionalità che consentirebbero all'ottimizzatore di prendere in considerazione o forzarlo a materializzare il "risultato" di un CTE, ma non ancora implementate:

Nel frattempo, la soluzione più comune è materializzare esplicitamente il set di risultati intermedi in una tabella temporanea o variabile di tabella. Ciò ovviamente richiede uno scenario non limitato a una singola istruzione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.