为什么从表变量中选择比整数列表慢得多

时间:2015-04-15 21:14:48

标签: sql sql-server tsql stored-procedures

我有一个非常大的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条记录。为什么从表变量中选择这么快得多?

1 个答案:

答案 0 :(得分:2)

您可以考虑的其他两个可能选项

选项1

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')

选项2

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的一排并不是真正的交易破坏者。