Direi che si trattava quasi sicuramente di uno sniffing dei parametri.
Si afferma spesso che SET OPTIONS
può influire sulle prestazioni in questo modo, ma devo ancora vedere un'unica fonte autorevole per questa affermazione, tranne nel caso in cui si utilizzino visualizzazioni indicizzate / colonne calcolate persistenti.
In questo caso (per SQL2005 + e, a meno che il database non sia in modalità di compatibilità SQL2000 ). Se hai entrambi ARITHABORT
e ANSI_WARNINGS
OFF
allora troverai che l'indice non viene utilizzato, quindi potresti avere una scansione piuttosto che la ricerca desiderata (e un certo sovraccarico poiché il risultato del calcolo persistente non può essere usato). ADO.NET sembra avere come impostazione predefinita ANSI_WARNINGS ON
un test rapido che ho appena fatto.
L'affermazione nella risposta di Ben secondo cui "il modo in cui il server esegue calcoli numerici" può aggiungere minuti a un risultato che altrimenti richiederebbe meno di un secondo non mi sembra credibile. Penso che ciò che tende a succedere sia che, quando si studia un problema di prestazioni, Profiler viene utilizzato per identificare la query offensiva. Questo viene incollato in Management Studio ed eseguito e restituisce immediatamente i risultati. L'unica differenza apparente tra le connessioni è l' ARITH_ABORT
opzione.
Un test rapido in una finestra di Management Studio mostra che quando SET ARITHABORT OFF
viene attivato e viene eseguita la query, il problema di prestazioni si ripresenta in modo che apparentemente venga chiuso. In effetti, questa sembra essere la metodologia di risoluzione dei problemi utilizzata nel collegamento Gregg Stark .
Tuttavia, ciò ignora il fatto che con quell'opzione impostata è possibile ottenere esattamente lo stesso piano errato dalla cache .
Il riutilizzo di questo piano può verificarsi anche se si è effettuato l'accesso come utente diverso da quello utilizzato dalla connessione dell'applicazione.
Ho provato questo eseguendo prima una query di prova da un'applicazione Web e poi da Management Studio con SET ARITHABORT OFF
e ho potuto vedere gli account utente salire dalla query di seguito.
SELECT usecounts, cacheobjtype, objtype, text ,query_plan
FROM sys.dm_exec_cached_plans
CROSS APPLY sys.dm_exec_sql_text(plan_handle)
CROSS APPLY sys.dm_exec_query_plan(plan_handle)
Affinché questa condivisione dei piani pf avvenga effettivamente, tutte le chiavi della cache del piano devono essere uguali. Oltre a se arithabort
stesso, alcuni altri esempi sono gli utenti che eseguono lo stesso schema predefinito (se la query si basa sulla risoluzione implicita del nome) e le connessioni necessitano dello stesso language
set.
Un elenco più completo di chiavi della cache del piano qui