SQL Server gespeicherte Prozedur viel langsamer als direkte Abfrage

8

Ich habe eine Tabelle mit über 100MM-Datensätzen. Die Tabelle enthält einen gruppierten Index und einen nicht gruppierten Index.

Ich kann eine Grundzählung mit T-SQL auf der Tabelle ausführen und es dauert 1 Sekunde, um zu laufen. Wenn ich innerhalb einer Stored Procedure die gleiche genaue Anzahl Abfrage anlege, dauert es 12 Sekunden.

Ich habe den Ausführungsplan sowohl für die Standardabfrage als auch für die gespeicherte Prozedur betrachtet, und beide verwenden den Nonclustered-Index.

Ich bin nicht sicher, warum die gespeicherte Prozedur im Vergleich zur Standardabfrage so langsam ist.

Ich habe in einer solchen Situation einiges über Reindexing gelesen, aber ich bin nicht sicher, warum ich das tun muss. Es dauert auch ein paar Stunden, um neu zu indizieren, also möchte ich sicherstellen, dass das funktioniert.

Jede Hilfe dazu wäre großartig.

Danke

AKTUALISIEREN

Hier ist die gespeicherte Prozedur:

%Vor%

und hier ist die Standardabfrage:

%Vor%

Ich habe versucht, es ohne Parameter auszuführen, und der SP läuft viel schneller (1 Sekunde). Ich gehe also davon aus, dass es etwas mit den Parametern zu tun hat.

    
Sequenzia 22.10.2012, 04:47
quelle

4 Antworten

16

Versuchen Sie, Ihren SP so zu ändern, dass lokale Kopien der übergebenen Variablen verwendet werden.

Etwas wie

%Vor%

Ich habe vorher gefunden, dass ein SP aufgrund von Parameter Snffing viel langsamer laufen kann, aber die Leistung kehrt zurück, sobald Sie Kopien der Variablen verwenden.

Was ist Parameter-Sniffing?

SQL Server: Parameter Sniffing

    
Adriaan Stander 22.10.2012 05:02
quelle
4

Wie bereits erwähnt, könnte dies ein parameter sniffing Problem sein. Versuchen Sie, die Zeile einzufügen:

%Vor%

am Ende Ihrer SQL-Abfrage.

Es gibt einen Artikel, der erklärt, welcher Parameter Sniffing ist: Ссылка

    
ninjaPixel 22.01.2014 16:44
quelle
1

Sie könnten immer versuchen, es als dynamisches sql auszuführen:

%Vor%     
digscoop 22.10.2012 06:57
quelle
0

Wenn Sie die gespeicherte Prozedur zum ersten Mal ausführen, muss SQL Server die gespeicherte Prozedur kompilieren, was einige Zeit dauern kann. @Andander erwähnt Parameter Sniffing - das ist ein gültiger Punkt, und kann Ihre Ergebnisse verfälschen.

Einige andere Faktoren zu berücksichtigen sind (während sie Ihre Symptome nicht wirklich erklären sollten):

  • Sie könnten eine Sperrstufe erzwingen, z. WITH (NOLOCK) nach dem Tabellennamen, wodurch das Problem behoben werden kann (beachten Sie jedoch, dass Sie dadurch ungenaue Ergebnisse erhalten könnten).
  • Möglicherweise müssen Sie die Statistiken für die Tabelle aktualisieren oder die Indizes defragmentieren
ifx 22.10.2012 20:25
quelle