SQL Server gespeicherte Prozedur wesentlich langsamer als die geraden Abfrage
Ich habe eine Tabelle mit über 100MM Datensätze. Die Tabelle besitzt einen gruppierten index und ein nicht gruppierter index.
Ich einen basic-Anzahl durch die Verwendung von T-SQL auf dem Tisch, und es dauert 1 Sekunde zu laufen. Wenn ich die gleiche genaue Anzahl Abfrage innerhalb einer gespeicherten Prozedur es dauert dann 12 Sekunden zu laufen.
Ich habe mir den plan für die Ausführung der standard-Abfrage und die gespeicherte Prozedur, und Sie werden beide mit der nicht gruppierte index.
Ich bin nicht sicher, warum die gespeicherte Prozedur ist so langsam im Vergleich zu den standard-Abfrage.
Ich habe einige Sachen über Neuindizierung in einer situation wie dieser, aber ich bin nicht sicher, warum ich brauche, um zu tun. Auch, es dauert ein paar Stunden, um reindex so möchte ich sicherstellen, dass das funktionieren wird.
Jede Hilfe zu diesem wäre toll.
Dank
UPDATE
Hier wird die gespeicherte Prozedur:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE quickCount
@sYID INT,
@eYID INT
AS
BEGIN
SET NOCOUNT ON;
SELECT COUNT(leadID)
FROM dbo.leads
WHERE yearID >= @sYID
AND yearID <= @eYID
END
GO
und hier ist die standard-Abfrage:
SELECT COUNT(leadID)
FROM leads
WHERE yearID >= 0
AND yearID <= 99
Ich habe versucht es ohne Parameter ausführen und der SP läuft schneller (1 Sekunde). Also gehe ich davon aus, dass es hat etwas zu tun mit den Parametern.
- Können Sie uns zeigen, ein bisschen von der SP, doe Sie pass in Parameter?
- Ich denke, du wirst brauchen, um Ihre Abfrage, und SP.
- Es kann passieren, Sie habe versucht die Abfrage mit Konstanten und Ihre Vorgehensweise verwenden Sie stattdessen die Parameter dieser Konstanten. Ich schlage vor, Sie erstellen SQLFiddle Beispiel oder post, einige details über das schema und query/sp
- Führen Sie beide gegen einen "kalten" Seite-Puffer? Oder welche der beiden Sie zum ersten mal ausgeführt? Ich würde versuchen, das zu tun
DBCC DROPCLEANBUFFERS
undDBCC FREEPROCCACHE
vor dem ausführen entweder von denen zwei nicht der Zeitpunkt der Ausführung Unterschied noch auftreten? Oder sind beide die gleiche Geschwindigkeit jetzt? - Sollte keine Rolle spielen, afaik, aber könnten Sie versuchen, die einfachen Abfrage mit
SET ANSI_NULLS ON
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie Ihr SP auf lokale Kopien der Variablen übergeben.
Etwas wie
Habe ich vorher gefunden, dass aufgrund der Parameter Snffing, ein SP kann ausführen viel langsamer, aber die Leistung gibt wenn Sie Kopien der Variablen.
Was ist die Parameter-Sniffing ?
SQL Server : Parameter Sniffing
Wie bereits erwähnt, könnte dies ein parameter sniffing problem. Versuchen Sie darunter die Zeile:
am Ende der SQL-Abfrage.
Gibt es hier einen Artikel zu erklären, was parameter-sniffing: http://blogs.technet.com/b/mdegre/archive/2012/03/19/what-is-parameter-sniffing.aspx
Können Sie immer versuchen, um Sie auszuführen als dynamisches sql:
Wenn Sie das erste mal ausführen der gespeicherten Prozedur, SQL-Server, der zum kompilieren der gespeicherten Prozedur, die einige Zeit dauern kann. @Astander genannten parameter sniffing - das ist ein Gültiger Punkt, und können verzerren die Ergebnisse.
Einige andere Faktoren zu berücksichtigen sind (während Sie nicht wirklich erklären, Ihre Symptome):
WITH (NOLOCK)
nachdem der name der Tabelle, die könnte das Problem beheben (aber beachten Sie, dass Sie ungenaue Ergebnisse dabei).