为什么从 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 并不是真正的交易破坏者。
我有一个非常大的 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 并不是真正的交易破坏者。