0

このクエリを最適化するにはどうすればよいですか:

declare @MyParam nvarchar(100) = 25846987;

select top 100 * from MySelectTable
where
(MyParam = @MyParam)
OR
(@MyParam = 0 and MyParam in (SELECT MyParam FROM aMassiveSlowTable WHERE Id = 'random1'))
OR
(@MyParam = 1 and MyParam in (SELECT MyParam FROM aMassiveSlowTable WHERE Id = 'random2'))
OR
(@MyParam = 2 and MyParam in (SELECT MyParam FROM aMassiveSlowTable WHERE Id = 'random3'))

この部分だけを使用する場合:

declare @MyParam nvarchar(100) = 25846987;

select top 100 * from MySelectTable
where
(MyParam = @MyParam)

1秒で戻ります。

すべてのパラメータを使用すると、約 5 分かかります。

MyParam = @MyParam に一致させるだけでよい場合に、aMassiveSlowTable をスキャンしているためだと思います。

@MyParam が MyParam と一致する場合、他のすべての比較をスキップするにはどうすればよいですか? CASE ステートメントを使用してみましたが、 IN句では機能しません。括弧内の AND を再配置し、追加のフィルタリングをaMassiveSlowTableに追加しようとしました。

@MyParam が MyParam と一致しない場合は、クエリがもう少し長くても問題ありません。

4

2 に答える 2

0


これにより、早期に評価する必要がある場所で修正される可能性があります

(MyParam in (SELECT MyParam FROM aMassiveSlowTable WHERE Id = 'random1' and @MyParam = 0 )) 

また

declare @MyParam nvarchar(100) = 25846987;
select * 
from MySelectTable
where MyParam = @MyParam 
union
select *  
from MySelectTable
join aMassiveSlowTable as Slow 
 and Slow.MyParam = MySelectTable.MyParam 
 and Slow.ID = 'random0'
where @MyParam = 0
union
select *  
from MySelectTable
join aMassiveSlowTable as Slow 
 and Slow.MyParam = MySelectTable.MyParam 
 and Slow.ID = 'random1'
where @MyParam = 1
union
select *  
from MySelectTable
join aMassiveSlowTable as Slow 
 and Slow.MyParam = MySelectTable.MyParam 
 and Slow.ID = 'random2'
where @MyParam = 2

または、結合ヒントで遊ぶ

declare @MyParam nvarchar(100) = 25846987;
select top 100 * 
from MySelectTable
left join aMassiveSlowTable as Slow 
  on Slow.MyParam in (1,2,3)  -- now the optimizer has something hard to evalate
 and Slow.MyParam = MySelectTable.MyParam 
 or (Slow.MyParam = 0 and Slow.ID = 'random0')
 or (Slow.MyParam = 1 and Slow.ID = 'random1')
 or (Slow.MyParam = 2 and Slow.ID = 'random2')
where MyParam = @MyParam
于 2012-10-05T21:46:09.820 に答える
0

「すべてのパラメーターを使用する場合」という質問のパフォーマンスの側面については、次の kb を確認することをお勧めします。

修正: SQL Server 2008 または SQL Server 2008 R2 または SQL Server 2012 で相関 AND 述語を含むクエリを実行すると、パフォーマンスが低下する

http://support.microsoft.com/kb/2658214

于 2012-10-06T15:06:46.980 に答える