Ich habe eine gespeicherte Prozedur, die Daten aus 2 verschiedenen Quellen abrufen kann, abhängig davon, ob der Benutzer Daten aus einem einzelnen geschlossenen Zeitraum (archiviert in eine Data Warehouse-Tabelle) oder aus einem offenen Zeitraum (Daten aus der Transaktion) anfordert Tabellen).SQL IF ELSE Leistungsproblem
Wenn ich Parameter übergebe, die die Auswahl auf die Data-Warehouse-Tabelle beschränken (ein Jahr und einen Zeitraum für eine geschlossene Periode), dauert die Prozedur sehr lange, bis der ELSE BEGIN ...-Code auskommentiert wird. Es kommen keine Daten aus dem ELSE-Teil des Codes, aber es verlangsamt immer noch die Prozedur. Wenn ich den ELSE-Teil des Codes ausdekomme, ist es sehr schnell.
Ich habe versucht OPTION (RECOMPILE)
und ich benutze lokale Variablen, um zu vermeiden, Parameter Sniffing, aber es hilft nicht. Gibt es eine Möglichkeit, dies zu umgehen? Das Folgende ist ein Beispiel dafür, was ich so langsam läuft tun:
IF @Year <> 0 AND @Period <> 0 AND (SELECT PerClosedTimestamp
FROM Period
WHERE
PerCompanyID = @CompanyID AND
PerYear = @Year AND
PerPeriod = @Period) IS NOT NULL
BEGIN
SELECT
datawhse.column1, datawhse.column2, etc …
FROM
datawhse
END
ELSE
BEGIN
SELECT
trantable.column1, trantable.column2, etc…
FROM
trantable
END
Wenn ich die ELSE-Anweisung es läuft sehr schnell ausschließen:
IF @Year <> 0
AND @Period <> 0
AND (SELECT PerClosedTimestamp
FROM Period
WHERE PerCompanyID = @CompanyID
AND PerYear = @Year
AND PerPeriod = @Period) IS NOT NULL
BEGIN
SELECT datawhse.column1
,datawhse.column2, etc …
FROM datawhse
END
Keine Antwort, aber eine interessante und verwandte (nicht doppelte) Post http://dba.stackexchange.com/questions/9835/using-if-in-t-sql-weakens-oder-breaks-execution-plan- Caching – scsimon
Was passiert, wenn Sie TOP 1 vor "PerClosedTimestamp" hinzufügen oder EXISTS verwenden? Versuchen Sie auch, die Bedingungen zu ändern, wenn Jahr = 0 oder Periode = 0 oder (wählen Sie ...) Null ist, dann machen Sie den zweiten Block, ELSE macht den ersten. Versuchen Sie auch, "WHERE Year = 0 oder Period = 0" (durch Dublierbedingung) in den zweiten Block zu schreiben. – Anton
Es wäre nett, Abfragepläne für langsame und schnelle Ausführungen zu sehen. –