如何使用复合索引减少表上的扫描计数?

时间:2015-04-01 17:27:15

标签: sql sql-server

我们有一个包含约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,网络版)

2 个答案:

答案 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
  • 如果可能没有匹配项并且您想要过滤行,请使用子查询或CTE。