2011-01-06 12 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 
*/ 

tempにはレコードがありませんが、実行には時間がかかります。SQLの最適化条件文

私も

if not exists (select 1 from #transferTheseItems) 
return 

を試してみたが、何も変わっていません。

私はSQL Serverが決して実行されない部分を分析しようとしていると思います。

これをスキップする方法はありますか?

+0

時間がかかることはSELECT INTOではないと確信していますか? – erikkallen

+0

に選択すると時間がかかりません。 if文の後に大きなクエリがあります。 問題は、条件がfalseの場合でも実行に時間がかかりすぎることです。 SQL Serverは決して実行されないクエリをコンパイルしようとします。 – fkucuk

答えて

1

は、それはあなたを助けるかもしれませ:

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

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

は、最後に私が実現しました。

は、クエリは、あなたの複雑なクエリが実行されない場合でも、実行に時間がかかる最初の実行のために、この

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

を試してみてください。 SQLは「実行計画」を生成するためです。

もう一度実行すると、時間がほとんどかからないことがわかります。 SQL Serverはそのクエリの実行計画を保存していたためです。

0

IFブロックに複数のステートメントがあることを意図していて、IFブロック内にそれらを保持するためにBEGINとENDを使用することを忘れていたのでしょうか。実行計画を作成する大規模なクエリが長くかかることはありませんが、一般に最も時間がかかるのはクエリの実行です。ただし、条件付き処理を使用する場合は、BEGINブロックとENDブロックを使用して別の指定をしない限り、ifの後の最初の文だけがIFの一部になります。 IFに文を1つだけ入れるつもりでも、私はBEGINとENDを使います。これは微妙なバグであるため、コードをスキャンするだけでは見つからないことがあります。