2 Stimmen

optimierung bedingter anweisungen in sql

select Item 
into #transferTheseItems
from IDTable where id = @myCondition

if exists (select 1 from #transferTheseItems)
/*
insert this huge data to a remote database over linked server
*/

obwohl kein Datensatz in der Temp-Datei vorhanden ist, dauert die Ausführung der Abfrage zu lange.

Ich habe auch versucht

if not exists (select 1 from #transferTheseItems)
return

aber es hat sich nichts geändert.

Ich denke, dass der Sql-Server versucht, den Teil zu analysieren, den er nie ausführen wird.

Gibt es eine Möglichkeit, dies zu überspringen?

1voto

Michael Pakhantsov Punkte 24167

Vielleicht hilft es Ihnen ja:

select Item 
into #transferTheseItems
from IDTable where id = @myCondition

IF @@ROWCOUNT > 0
    ....
ELSE
    ....

0voto

fkucuk Punkte 611

Endlich habe ich es begriffen;

Versuchen Sie dies

if 1 = 0
select * from a
join b on a.ID = b.ID
join c on c.ID = b.ID

Bei der ersten Ausführung benötigt die Abfrage Zeit, auch wenn Ihre komplexe Abfrage nicht ausgeführt wird. Denn Sql generiert einen "Ausführungsplan".

führen Sie es erneut aus, und Sie werden sehen, dass es fast keine Zeit braucht. Denn Sql-Server hat den Ausführungsplan für diese Abfrage gespeichert.

0voto

HLGEM Punkte 91543

Ich frage mich, ob Sie vielleicht mehr als eine Anweisung im IF-Block haben wollten und vergessen haben, BEGIN und END zu verwenden, um sie im IF-Block zu halten. Selbst bei einer großen Abfrage sollte die Erstellung eines Ausführungsplans nicht lange dauern, da die Ausführung der Abfrage im Allgemeinen die meiste Zeit in Anspruch nimmt. Bei der Verwendung der bedingten Verarbeitung ist jedoch nur die erste Anweisung nach dem if-Block Teil des IF-Blocks, es sei denn, Sie geben etwas anderes an, indem Sie BEGIN- und END-Blöcke verwenden. Selbst wenn ich beabsichtige, nur eine Aussage in den IF zu setzen, verwende ich BEGIN und END, um die Zuverlässigkeit zu gewährleisten, da es sich um einen subtilen Fehler handelt, der beim bloßen Scannen des Codes schwer zu finden ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X