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秒内得到结果.
是否有理由在使用变量而不是将值硬编码到需要更长时间的位置?我完全被这个难以接受,任何帮助都将非常感激.
谢谢!
克里斯托弗哈斯
好的,我用我的查询重现了这种情况:
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)
一切都很快了!
| 归档时间: |
|
| 查看次数: |
2727 次 |
| 最近记录: |