È possibile fornire all'ottimizzatore più o tutto il tempo necessario?


18

Dato che l'ottimizzatore non può richiedere tutto il tempo necessario (deve ridurre al minimo i tempi di esecuzione e non contribuire ad esso) per esplorare tutti i possibili piani di esecuzione che a volte vengono interrotti.

Mi chiedevo se questo può essere ignorato in modo da poter dare all'ottimizzatore tutto il tempo necessario (o una certa quantità di millisecondi).

Non ho bisogno di questo (atm), ma posso immaginare uno scenario in cui una query complessa viene eseguita in un ciclo stretto e si desidera elaborare il piano ottimale e memorizzarlo nella cache in anticipo.

Certo che hai un ciclo stretto dovresti riscrivere la query in modo che vada via ma abbi pazienza con me.

Questa è più una domanda per curiosità e anche per vedere se a volte c'è una differenza tra un'ottimizzazione in corto circuito e una completa.

Si scopre che è possibile concedere all'ottimizzatore più tempo con il flag di traccia 2301. Non è esattamente quello che stavo chiedendo ma si avvicina.

Le migliori informazioni che ho trovato su questo sono nelle estensioni di modellazione del processore di query in SQL Server 2005 SP1 di Ian Jose.

Usa questo flag di traccia con cura! Ma può essere utile quando si escogitano piani migliori. Guarda anche:

Stavo pensando a query con molti join in cui lo spazio della soluzione per l'ordine dei join esplode in modo esponenziale. L'euristica che utilizza SQL Server è piuttosto buona, ma mi chiedevo se l'ottimizzatore avrebbe proposto un ordine diverso se avesse avuto più tempo (nell'intervallo di secondi o addirittura minuti).

Risposte:


16

Accanto a trace flag 2301, c'è 8780 che rende davvero l'ottimizzatore "più duro" poiché gli dà solo più tempo (non illimitato, come descritto in dettaglio qui (russo) e meno dettagliato qui ) per fare la sua cosa.

Descrizione dettagliata in inglese dell'autore originale dell'articolo russo. che include l'avvertimento dell'autore:

non è consigliabile usarlo mai in produzione .

Combinando i due e applicandoli (in modo molto selettivo tramite OPZIONE suggerimento query (QUERYTRACEON 2301, QUERYTRACEON 8780) a una query di TVF in linea nidificati a 4 livelli (in cui solo quello in basso farebbe qualsiasi lavoro reale e i livelli superiori metterebbero in relazione i risultati tramite le subquery EXISTS) ha prodotto un bel MERGE JOIN e diverse LAZY SPOOL che hanno dimezzato i tempi di esecuzione.


4

No, non puoi.

Puoi rendere le tue query "ottimizzatore-friendly" capendo come funziona (bestia complessa, non è necessario conoscerla a fondo). Suggerirei che se qualcosa di così critico nel tempo, allora risolvi la query piuttosto che cambiare il funzionamento di SQL Server.

Ad esempio, vorresti sapere quando una query inizia a ridimensionare in modo meno efficiente di O (n) quando il volume di dati + la distribuzione dei dati cambia: dare più tempo all'ottimizzatore non aggiunge alcun valore.

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.