我们有一个包含约300万行的表(T)和两个INT列(ID1和ID2),它们一起被设置为复合聚类键。
在存储过程的早期,我们创建了一个表变量(@A),它包含一个INT列表。
慢速查询如下
SELECT T.ID1, T.ID2
FROM T
INNER JOIN @A AS A
ON A.ID = T.ID1
@A只有几百行,T包含几百万行。问题是T的扫描计数为几百。我不知道如何让它消失。
我尝试在T上创建另一个索引,其中包含列ID1和ID2,但它没有帮助(执行计划程序显示使用了新索引)。
如何减少表T上的扫描次数?
(我们正在使用SQL Server 2014,网络版)
答案 0 :(得分:0)
尝试创建一个包含(覆盖索引):
create index idx_t_id1 on t(id1) include id2
这将允许您的查询在索引页面中查找所需的所有内容,而不必在主表中进行搜索。那么表t上是否有聚集索引?
答案 1 :(得分:0)
您可以尝试按如下方式填写查询:
select a.id as id1,
(select t.id2
from t
where t.id1 = a.id
) as id2
from @a a;
这应扫描@a
并使用索引进行查找。
两个注释:
cross apply
。