我有一个非常大的MSSQL存储过程,我需要有条件地检查某些ID:
Select SomeColumns
From BigTable b
Join LotsOfTables l on b.LongStringField = l.LongStringField
Where b.SomeID in (1,2,3,4,5)
我想有条件地检查SomeID字段,所以我做了以下内容:
if @enteredText = 'This'
INSERT INTO @AwesomeIDs
VALUES(1),(2),(3)
if @enteredText = 'That'
INSERT INTO @AwesomeIDs
VALUES(4),(5)
Select SomeColumns
From BigTable b
Join LotsOfTables l on b.LongStringField = l.LongStringField
Where b.SomeID in (Select ID from @AwesomeIDs)
没有其他任何改变,但我甚至无法让后一个查询获取5条记录。 top查询在不到3秒的时间内返回5000条记录。为什么从表变量中选择这么快得多?
答案 0 :(得分:2)
您可以考虑的其他两个可能选项
Select SomeColumns
From BigTable b
Join LotsOfTables l on b.LongStringField = l.LongStringField
Where
( b.SomeID IN (1,2,3) AND @enteredText = 'This')
OR
( b.SomeID IN (4,5) AND @enteredText = 'That')
Select SomeColumns
From BigTable b
Join LotsOfTables l on b.LongStringField = l.LongStringField
Where EXISTS (Select 1
from @AwesomeIDs
WHERE b.SomeID = ID)
请注意表变量,SQL Server总是假设表中只有一行(sql 2014除外,假设是100行),它可以影响估计和实际计划。但是对阵3的一排并不是真正的交易破坏者。