Domanda

Ho letto sul 2008 OPTIMIZE SQL Server query FOR UNKNOWN suggerimento. Capisco come funziona.

Comunque, ho una domanda su , dove e quando di usarlo. Esso non può essere specificato all'interno di un'UDF. Può essere specificato all'interno di un proc memorizzato. Tuttavia, questo MSDN blog stati pubblicare la seguente :

  

4.Moving una query in una stored procedure può mettere in un separato   contesto procedurale e può essere una buona   modo per ottenere quel valore visibile al   Optimizer (Nota: questo funziona in SQL   2000, nonché)

Questo mi sembra voler dire che qualsiasi parametro passato a una stored procedure verrà "annusato", contribuendo in tal modo SQL Server per compilare un piano di esecuzione ottimale. Questo è il che implica che il piano memorizzato nella cache sarebbe stato rivisitato / ricompilato (non sono sicuro di tale meccanismo). Tuttavia, questo è fonte di confusione, perché nega l'intero necessità di OPTIMIZE FOR UNKNOWN.

L'articolo MSDN su hint per la query non copre la mia domanda.

qualcuno risposta

Can questo per me, idealmente con un puntatore a qualcosa da Microsoft che cancella questo in su. Grazie.

È stato utile?

Soluzione

Il comportamento predefinito del compilatore SQL è quello di utilizzare i valori di tutti i parametri indicati nella prima esecuzione di una SP per ottimizzare il piano (vedere paragrafi 2 e 3 questo articolo di MSDN sulla SP ricompilazione ). Tale piano viene poi memorizzato nella cache per il riutilizzo, fino a quando non lascia la cache - un sacco di dettagli sul processo di piano di caching qui .

Il MSDN blog lei cita è notando modi per rendere questo processo più facile per il compilatore; Credo che il punto 4 (citato nella questione) sta suggerendo che questo è un vantaggio di stored procedure di SQL oltre ad-hoc.

Il suggerimento OPTIMIZE FOR UNKNOWN istruisce il compilatore a aviod il comportamento predefinito; che dovrebbe ignorare i valori dei parametri indicati nella prima esecuzione e selezionare un piano più generalizzata. Questa è una versione più estrema del punto 2 nella lista di suggerimenti, alla fine del post citato nella questione;

  

2 Se si scopre che l'ottimizzatore è   raccogliendo diversi piani nel corso del tempo che   hanno prestazioni variando   caratteristiche, è consigliabile utilizzare una   parametro suggerimento con un rappresentante   valore “medio” per ottenere un buon, comune,   piano di query che funziona ragionevolmente   per tutti i valori.

ma piuttosto che selezionare un valore medio o rappresentativo, il compilatore efficacemente ignorare i valori dei parametri del tutto.

Si consideri utilizzando OPTIMIZE FOR UNKNOWN nelle date circostanze citate al punto 2 - quando la stessa query fornisce prestazioni molto variabili perché il piano è scarsa in alcune circostanze -. In genere quando i parametri nelle colonne del filtro di query di cardinalità molto variabili

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top