Lo sniffing dei parametri aggira il problema


8

Ho usato due metodi per aggirare i problemi di sniffing dei parametri in passato:

1) Usa WITH RECOMPILE
2) Riassegna i valori dei parametri alle variabili locali e usa quelli invece dei parametri

Da quanto ho capito, il risultato finale di entrambi è lo stesso: viene creato e utilizzato un nuovo piano di esecuzione ottimizzato per la query / i parametri correnti.

Se questo è vero, ci sono differenze tra questi due metodi o sono essenzialmente gli stessi? Uno è preferibile all'altro?

Risposte:


3

Se è possibile anticipare i valori tipici, eseguire la procedura memorizzata con tali valori ogni volta che (ri) la si crea. Un piano di esecuzione verrà creato sulla base di questi valori e memorizzato per uso futuro. La maggior parte dei miei .sqlfile di stored procedure termina con un EXECcomando con valori ragionevoli, proprio per questo scopo (quello e per identificare gli errori di base nel codice).

Ovviamente ciò non sarà d'aiuto se la procedura memorizzata dura molto a lungo, abbastanza da non poter essere ragionevolmente eseguita durante le ore di produzione. Si noti che non è sufficiente avviare il processo, ma deve essere completato correttamente affinché un piano venga archiviato.


4
  1. WITH RECOMPILE

Questo è un po 'un martello. Ricompila ogni istruzione nel modulo. L'uso OPTION (RECOMPILE)delle istruzioni sensibili ai parametri è una soluzione più mirata.

  1. Riassegna i valori dei parametri alle variabili locali e usali al posto dei parametri

Ciò ha lo stesso effetto di OPTIMIZE FOR UNKNOWNun piano generato in base a valori medi. Il piano non si ricompila per ogni esecuzione.

Per ulteriori informazioni, consultare il mio articolo Parametro Sniffing, Embedding e le opzioni RECOMPILE .

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.