Questo è quello che ho imparato finora dalla mia ricerca.
.NET invia le impostazioni di connessione che non corrispondono a quelle ottenute quando si accede allo studio di gestione. Ecco ciò che si vede se si annusa il collegamento con SQL Profiler:
-- network protocol: TCP/IP
set quoted_identifier off
set arithabort off
set numeric_roundabort off
set ansi_warnings on
set ansi_padding on
set ansi_nulls off
set concat_null_yields_null on
set cursor_close_on_commit off
set implicit_transactions off
set language us_english
set dateformat mdy
set datefirst 7
set transaction isolation level read committed
ora sto incollando quelli impostazione di sopra di ogni query che ho eseguito quando si accede al server SQL, per assicurarsi che le impostazioni sono le stesse.
In questo caso, ho provato ciascuna impostazione singolarmente, dopo aver scollegato e ricollegato, e ho scoperto che la modifica di arithabort da off a on ha ridotto la query del problema da 90 secondi a 1 secondo.
La spiegazione più probabile è relativa allo sniffing dei parametri, che è una tecnica utilizzata da Sql Server per selezionare quello che ritiene sia il piano di query più efficace. Quando si modifica una delle impostazioni di connessione, Query Optimizer potrebbe scegliere un piano diverso e in questo caso, apparentemente, ha scelto un programma non valido.
Ma non ne sono totalmente convinto. Ho provato a confrontare i piani di query effettivi dopo aver modificato questa impostazione e devo ancora vedere la differenza mostrare eventuali modifiche.
C'è qualcos'altro nell'impostazione di arithabort che potrebbe causare una query in modo lento in alcuni casi?
La soluzione sembrava semplice: basta mettere arithabort su nella parte superiore della stored procedure. Ma questo potrebbe portare al problema opposto: cambiare i parametri della query e improvvisamente funziona più velocemente con 'off' rispetto a 'on'.
Per ora sto eseguendo la procedura 'con ricompilare' per assicurarmi che il piano venga rigenerato ogni volta. Va bene per questo particolare report, poiché ci vuole forse un secondo per ricompilare, e questo non è troppo evidente in un report che richiede da 1 a 10 secondi per tornare (è un mostro).
Ma non è un'opzione per altre query eseguite molto più frequentemente e devono essere restituite il più rapidamente possibile, in pochi millisecondi.
Ho avuto lo stesso problema e http://stackoverflow.com/questions/250713/sqldataadapter-fill-method-slow ha risolto il mio problema – David