Ich habe eine Abfrage in einer gespeicherten Prozedur, die Daten aus mehreren Tabellen meiner SQL Server-Datenbank abruft. Von meiner Anwendung aus rufe ich diese gespeicherte Prozedur mit einigen Parametern auf, um die Daten zu filtern.Abfrage in SQL Server gespeicherte Prozedur dauert länger für bestimmte Daten als für alle Daten
Die seltsame Sache ist, dass für alle Daten für "X" Woche des Jahres (etwa 2600 Datensätze) dauert es etwa 30 Sekunden, um die Daten abzurufen. Aber wenn ich einen spezifischen "Center" -Filter für die gleiche Woche des Jahres hinzufüge (ungefähr 1800 Datensätze), dauert es ungefähr 3 Minuten, um die Daten zu erhalten!
Wenn ich nur die Abfrage ausführen, funktioniert es gut (30 Sekunden für alle Daten und etwa 22 Sekunden für gefilterte Daten). Das Problem ist, wenn ich die Abfrage durch die gespeicherte Prozedur ausführen!
Wie ist das möglich? Warum benötigen gefilterte Daten etwa x6-mal mehr als alle Daten? Warum vermisse ich? Schreib ich die gespeicherte Prozedur korrekt? Wie kann ich das effizienter machen?
Mein Code der gespeicherten Prozedur ist so etwas wie folgt aus:
ALTER PROCEDURE EventMonitoring
@EventType AS CHAR(1),
@Year AS INT,
@Week AS INT,
@CenterID AS CHAR(2),
@AreaID AS INT
AS
DECLARE @SQLCommand AS VARCHAR(MAX)
DECLARE @MessageError AS VARCHAR(MAX)
SET @SQLCommand = ' SELECT ....
....
....
....
FROM Event E
INNER JOIN ...
INNER JOIN ...
INNER JOIN ...
WHERE E.EventYear = ' + CAST(@Year AS VARCHAR) +
' And E.EventWeek = ' + CAST(@Week AS VARCHAR) +
' And E.EventType = ' + CAST(@EventType AS VARCHAR)
IF @Centro <> '-' --If application sends - as the parameter, it gets all centers
BEGIN
@SQLCommand = @SQLCommand + ' AND E.CenterID = ''' + @CenterID + ''''
END
IF @Area <> 0 --If application sends 0 as the parameter, it gets all areas
BEGIN
@SQLCommand = @SQLCommand + ' AND E.AreaID = ' + CAST(@AreaID AS VARCHAR)
END
SET @SQLCommand = @SQLCommand + 'GROUP BY ....'
BEGIN TRY
EXEC(@SQLCommand)
END TRY
BEGIN CATCH
....
END CATCH
Können Sie die Tabellenstruktur anzeigen und Indizes darauf? Wie viele Zeilen in der Tabelle? – SchmitzIT
Was passiert, wenn Sie Ihre Abfrage außerhalb des Prozesses mit 'DBCC FREEPROCCACHE' ausführen? Spiegelt die Ausführungszeit die Ausführungszeiten Ihres SP besser wider? – scsimon
Zeigen Sie uns beide Pläne? https://www.brentozar.com/pastetheplan/ –