2011-01-06 4 views
2
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 es keinen Eintrag im Temp gibt, dauert die Abfrage zu lange, um ausgeführt zu werden.Optimierung der bedingten Anweisung in SQL

Ich habe auch versucht,

if not exists (select 1 from #transferTheseItems) 
return 

aber nichts geändert.

Ich denke, der SQL-Server versucht, den Teil zu analysieren, den es nie ausführen wird.

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

+0

Sind Sie sicher, dass das Ding, das Zeit nimmt, nicht das SELECT INTO ist? – erikkallen

+0

Wählen Sie in dauert keine Zeit. Es gibt eine riesige Abfrage nach der if-Anweisung. Das Problem ist, obwohl die Bedingung falsch ist, dauert es zu lange, um auszuführen. Ich denke, SQL Server versucht, die Abfrage zu kompilieren, die nie ausgeführt wird. – fkucuk

Antwort

1

Möchte es dir helfen:

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

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

Schließlich erkennen ich;

versuchen diese

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

Für die erste Ausführung der Abfragezeit, auch wenn Ihre komplexe Abfrage ausgeführt wird, nicht ausgeführt werden braucht. Weil sql einen "Ausführungsplan" generiert.

führen Sie es erneut, und Sie sehen, dass es fast keine Zeit braucht. Weil der SQL Server den Ausführungsplan für diese Abfrage gespeichert hat.

0

Ich frage mich, ob perhps beabsichtigte, mehr als eine Anweisung im IF-Block zu haben und vergaß, BEGIN und END zu verwenden, um sie im IF-Block zu behalten. Selbst für eine große Abfrage sollte die Erstellung eines Ausführungsplans nicht lange dauern, da die Ausführung der Abfrage in der Regel die meiste Zeit in Anspruch nimmt. Wenn Sie jedoch bedingte Verarbeitung verwenden, ist nur die erste Anweisung nach dem if Teil der IF, es sei denn, Sie geben mithilfe der BEGIN- und END-Blöcke eine andere Anweisung vor. Selbst wenn ich beabsichtige, nur ein Statement in die IF zu setzen, benutze ich BEGIN und END, um maintainbilty, weil es ein subtiler Programmfehler ist, der schwer sein kann, nur den Code zu scannen.