Die Abfrage ist für bestimmte Benutzer langsam

11

Ich habe einige Abfragen von einer C # .NET-Webanwendung aufgerufen, die für mich immer schnell sind (ich bin ein lokaler Administrator auf dem SQL Server), aber für eine Gruppe von Benutzern (Domänengruppe mit erforderlichen Berechtigungen) ist die Abfrage unglaublich langsam der Punkt, an dem es in der Anwendung abläuft.

Was würde dazu führen, dass genau dieselbe Abfrage für verschiedene Benutzer unterschiedlich ausgeführt wird?

Mehr Info:

  • Die Abfrage ist Inline-SQL im C # -Code, keine gespeicherte Prozedur
  • Die App verwendet die Domänenauthentifizierung und sowohl der Benutzer als auch ich führen die Abfrage über die App aus
  • Es scheint, dass das Problem unterschiedliche Pläne sind und einer zwischengespeichert wurde, weshalb es für verschiedene Benutzer unterschiedlich war. Etwas wirkt sich auf den Cache aus, da die Abfrage jetzt für mich über die App langsam und in SQL Server Management Studio schnell ist.
Supergibbs
quelle
2
Überprüfen Sie die folgenden Fragen . Möglicherweise befinden Sie sich in derselben Situation. Sagen wir zuerst versuchen Sie dieses und dieses andere .
Marian
3
Was sind die Wartetypen (sys.dm_os_waiting_tasks) für die langsame Abfrage (n) und wie lauten die tatsächlichen Ausführungspläne für jede (Ihre schnelle, ihre langsame)?
Thomas Stringer
2
Stimmen Sie früheren Kommentaren zu. Mein erster Gedanke wäre auch das Schnüffeln von Parametern. Der erste Schritt sollte sein, zu überprüfen, ob die Pläne unterschiedlich sind.
Martin Smith
4
Wenn die Parameter gleich sind (ich gehe davon aus, dass dies gemeint ist exact same query), sollte es sich nicht um Parameter-Sniffing handeln (Benutzer erhalten einen schlechten Plan für die falschen Parameter), sondern Benutzer erhalten unterschiedliche Pläne für denselben Parameter (s). Dies kann an Einstellungen wie quoted_identifierund liegen arithabort, die Sie sys.dm_exec_sessionsfür den schnellen und den langsamen Benutzer vergleichen können, oder daran, dass sie unterschiedliche Standardschemata haben und Objekte ohne das Schema-Präfix referenziert werden. Möglicherweise ist das Parameter-Sniffing weiterhin beteiligt (daher hat einer von ihnen einen schlechten Plan).
Aaron Bertrand
1
RE: Haben Sie bei Ihrer Bearbeitung das gleiche Standardschema wie die anderen Benutzer? Haben Sie die Ausführungspläne für langsame und schnelle Läufe bereits erfasst?
Martin Smith

Antworten:

5

Wenn die Parameter gleich sind (ich gehe davon aus, dass dies gemeint ist exact same query), sollte es sich nicht um Parameter-Sniffing handeln (Benutzer erhalten einen schlechten Plan für die falschen Parameter), sondern Benutzer erhalten unterschiedliche Pläne für denselben Parameter (s). Dies kann an Einstellungen wie quoted_identifierund liegen arithabort, die Sie sys.dm_exec_sessionsfür den schnellen und den langsamen Benutzer vergleichen können, oder daran, dass sie unterschiedliche Standardschemata haben und Objekte ohne das Schema-Präfix referenziert werden. Möglicherweise ist das Parameter-Sniffing weiterhin beteiligt (daher hat einer von ihnen einen schlechten Plan).

Aaron Bertrand
quelle
3

Ich habe zwei Gründe dafür gesehen: 1, Parameter-Sniffing 2, Verbindungseinstellungen sind unterschiedlich. Wenn Sie whoisactive ausführen , werden Ihnen die verschiedenen Verbindungseigenschaften angezeigt . Ich habe tatsächlich einen Blog-Beitrag dazu, aber ich habe die unternehmensspezifischen Informationen nicht daraus entfernt. (noch habe ich mein Blog noch aktiviert);)

rottengeek
quelle
0

Versuchen Sie: Geben Sie das Schema für jede EXEC- und Tabellenreferenz an. ZB EXEC dbo.MyProc

Es kann zu Konflikten kommen (wie Martin Smith vorschlägt - "dasselbe Standardschema"?) Oder zu Neukompilierungen

Kip Bryan
quelle
0

Dies scheint ein Fehler in SQL Server zu sein. Ich habe diesen Fehler mit SQL Server 2008 festgestellt. Ich habe keine neuen Versionen getestet. Ich kann mich als Administrator anmelden und diese Abfrage ausführen und in 0 Sekunden eine Antwort erhalten:

select ROUTINE_NAME from INFORMATION_SCHEMA.ROUTINES ORDER BY ROUTINE_NAME

Dann melde ich mich als Benutzer mit weniger Berechtigungen an, führe genau dieselbe Abfrage aus und die Antwort dauert 45 Sekunden.

Dies ist immer und immer wieder konsistent. Wenn ich zwischen meinen beiden Abfragefenstern hin und her hüpfe, eines für den Administrator und eines für den Nicht-Administrator, dauert der Nicht-Administrator immer ungefähr 45 Sekunden und der Administrator 0 Sekunden.

Rob Kraft
quelle
Wie in den Kommentaren zur Frage gestellt - haben beide Benutzer dieselbe Standarddatenbank und werden die Abfragen in derselben Datenbank ausgeführt? Und können Sie auf eine Art Dokumentation verweisen, die besagt, dass dies ein Fehler ist, oder ist es Ihre Meinung? Nicht sagen, dass Sie falsch liegen, sondern nur nach etwas suchen, das über eine Anekdote hinausgeht.
RDFozz
Das Problem, das Sie in Ihrer Antwort identifiziert haben, scheint unter SQL Server 2008 nicht wiederholbar zu sein. Es gibt select ROUTINE_NAME from INFORMATION_SCHEMA.ROUTINES ORDER BY ROUTINE_NAMEkonsistent sofort Daten für eine Anmeldung ohne SA zurück, für die überhaupt keine expliziten Rechte gewährt wurden.
Max Vernon