Quanto è deterministica la creazione del piano di esecuzione in SQL Server?


13

Date le seguenti costanti:

  • Lo stesso database con la stessa struttura (tabelle, indici, ecc.)
  • Gli stessi dati
  • La stessa SQL Server e la stessa configurazione hardware
  • Le stesse statistiche
  • Le stesse opzioni SET nel client
  • Le stesse versioni di SQL Server
  • Le stesse tracce di traccia

Date queste costanti, SQL Server produrrà sempre lo stesso piano per una determinata query?

In caso contrario, ci sono altre considerazioni? C'è anche un elemento di non determinismo da considerare?


sarà errato dire lo stesso piano, ma possiamo dire un piano simile. Insieme ai fattori esterni che DBA / Developer può controllare; "algoritmi di ottimizzazione del piano di query" e "algoritmi di costo di query interno" sono scritti all'interno del motore del server SQL. non abbiamo il controllo di dire "cosa scegliere" in tutti i modi. possiamo impostare un ambiente esterno per guidare il motore a scegliere il meglio. per una determinata query se l'ottimizzatore ha escogitato due piani di esecuzione con diciamo una differenza di costo di 0,001, allora suppongo che sarà irrilevante quale piano di esecuzione scelga.
Anup Shah,

Non credo che dovresti essere teorico al riguardo. Ho lavorato 25 anni con diversi database ed è quasi sempre possibile riscrivere una query per eseguire meglio. E a volte è molto difficile capire perché è meglio con un modo di scrivere la query.

Risposte:


13

Date queste costanti, SQL Server produrrà sempre lo stesso piano per una determinata query? In caso contrario, ci sono altre considerazioni? C'è anche un elemento di non determinismo da considerare?

La compilazione delle query è deterministica per quanto ne so. Uno degli obiettivi di progettazione del QO originale era che sarebbe stato possibile riprodurre i piani di esecuzione su un sistema diverso usando una copia solo statistica del database. Ci sono un paio di sottigliezze in merito a parametri di configurazione come la quantità di memoria disponibile e il numero di processori logici, ma questi sono coperti dal tuo elenco di cose da sincronizzare.

Avvertenza: ciò è vero a condizione che la parola "uguale" nell'elenco sia considerata esattamente uguale sotto tutti gli aspetti . Ad esempio, le "stesse" statistiche potrebbero esistere sui due sistemi, ma sono esattamente le stesse se i passaggi dell'istogramma e le informazioni sulla densità sono identici .

Detto questo, anche il processo di ottimizzazione è estremamente complesso , il che significa che può essere difficile garantire che tutti gli input per questo processo deterministico siano identici e che tutti gli stati interni siano abbastanza simili da garantire che lo stesso percorso del codice venga preso attraverso l'ottimizzatore per un particolare compilazione. Se la query contiene accesso all'esterno del database (a un altro database o istanza), anche quegli ambienti devono essere identici.

Una cosa che aggiungerei alla tua lista è quella di verificare che eventuali guide del piano nel secondo database esistano anche .


L'uso di funzioni non deterministiche come GETDATE()nelle query potrebbe significare che si ottiene anche un piano diverso. Mentre l'ottimizzatore principale non utilizza direttamente il valore, la stima della cardinalità può (vedere Piegatura costante e Valutazione dell'espressione durante la stima della cardinalità ). Non sono sicuro che questa classe di differenza rientri nel campo di applicazione della domanda, poiché entrambi i sistemi produrrebbero lo stesso piano se eseguiti contemporaneamente (o, più in generale, con le stesse variabili di input, parametri e valori di funzione).

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.