Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Sniffing (o spoofing) dei parametri in SQL Server

Cordiali saluti:devi essere consapevole di qualcos'altro quando lavori con SQL 2005 e processi archiviati con parametri.

SQL Server compilerà il piano di esecuzione del processo archiviato con il primo parametro utilizzato. Quindi, se esegui questo:

usp_QueryMyDataByState 'Rhode Island'

Il piano di esecuzione funzionerà al meglio con i dati di un piccolo stato. Ma se qualcuno si gira e corre:

usp_QueryMyDataByState 'Texas'

Il piano di esecuzione progettato per dati di dimensioni Rhode Island potrebbe non essere efficiente con dati di dimensioni Texas. Ciò può produrre risultati sorprendenti al riavvio del server, perché il piano di esecuzione appena generato sarà mirato a qualsiasi parametro venga utilizzato per primo, non necessariamente il migliore. Il piano non verrà ricompilato finché non ci sarà una buona ragione per farlo, ad esempio se le statistiche vengono ricostruite.

È qui che entrano in gioco i piani di query e SQL Server 2008 offre molte nuove funzionalità che aiutano i DBA a bloccare un particolare piano di query a lungo termine, indipendentemente dai parametri che vengono chiamati per primi.

La mia preoccupazione è che quando hai ricostruito il tuo processo memorizzato, hai forzato la ricompilazione del piano di esecuzione. L'hai chiamato con il tuo parametro preferito, e poi ovviamente è stato veloce, ma il problema potrebbe non essere stato il proc memorizzato. Potrebbe essere stato che il processo memorizzato sia stato ricompilato a un certo punto con un insieme insolito di parametri e, quindi, un piano di query inefficiente. Potresti non aver risolto nulla e potresti riscontrare lo stesso problema la prossima volta che il server viene riavviato o il piano di query viene ricompilato.