当我将值设置为变量时,为什么我的SQL语句需要花费N倍的时间来运行?

Chr*_*aws 5 sql variables indexing long-integer

我想说的第一件事是,这并不是我想要实现的目标.我已经愚弄了这个问题很多,以便更清楚地解决我的问题.

我在表(CallDetail)上有两个值的非聚集索引,TermDate(int)和SourceSystemID(int).为了完整,我将在此处包含索引的精确定义:

CREATE NONCLUSTERED INDEX [CallDetail_TermDateSourceSystemID] ON [dbo].[CallDetail] 
(
    [TermDate] ASC,
    [SourceSystemID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,当我对这个表运行两个几乎相同的查询时,我得不到相同的结果(不要与结果集混淆).第一个查询在不到一秒的时间内运行并返回大约10,000行.第二个查询在执行时继续运行,直到我在大约30分钟后取消它.

查询1(~1秒):

SELECT
    *
FROM
    CallDetail
WHERE
    CallDetail.TermDate >= 1101221 AND
    SourceSystemID = 1
Run Code Online (Sandbox Code Playgroud)

查询2(> 30分钟):

DECLARE @TermDate AS INT
SET @TermDate = 1101221

SELECT
    *
FROM
    CallDetail
WHERE
    CallDetail.TermDate >= @TermDate AND
    SourceSystemID = 1
Run Code Online (Sandbox Code Playgroud)

我想要注意的是查询执行计划告诉我在索引中"包含"该表的所有列.我发现这是完全错误的.我还要注意,如果我只选择TermDate和SourceSystemID而不是*,我会在大约1秒内得到结果.

是否有理由在使用变量而不是将值硬编码到需要更长时间的位置?我完全被这个难以接受,任何帮助都将非常感激.

谢谢!

克里斯托弗哈斯

tst*_*ter 5

好的,我用我的查询重现了这种情况:

declare @a as int
set @a = 12972100
select * from MyTable where (MyColumn > @a)
Run Code Online (Sandbox Code Playgroud)

在读完marc_s的帖子之后,我这样做了:

declare @a as int
set @a = 12972100
select * from MyTable where (MyColumn > @a) option (recompile)
Run Code Online (Sandbox Code Playgroud)

一切都很快了!