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

Why is Selecting From Table Variable Far Slower than List of Integers

我有一个非常大的 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查询returns5000条记录不到3秒。为什么从 table 变量中选择的速度要慢得多?

您可以考虑另外两个可能的选项

选项 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)

请注意 Table 变量,SQL 服务器始终假设 table 中只有一行(sql 2014 除外,假设为 100 行)并且它会影响估计的和实际的计划。但 1 排对 3 并不是真正的交易破坏者。