繁体   English   中英

如何减少具有复合索引的表的扫描次数?

[英]How to reduce scan count on table with a composite index?

我们有一个包含约 300 万行和两个 INT 列(ID1 和 ID2)的表 (T),它们一起设置为复合聚集键。

在存储过程的早期,我们创建了一个由 INT 列表组成的表变量 (@A)。

慢查询如下

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,网络版)

尝试创建一个包含的(覆盖索引):

create index idx_t_id1 on t(id1) include id2

这将使您的查询在索引页中查找所需的所有内容,而不必在主表中进行搜索。 顺便说一句,表t上有聚集索引吗?

您可以尝试对查询进行这样的表述:

select a.id as id1,
       (select t.id2
        from t
        where t.id1 = a.id
       ) as id2
from @a a;

这应该扫描@a并使用索引进行查找。

两个注意事项:

  • 如果可以有多个匹配项,请改用cross apply
  • 如果可能没有匹配项,并且您想过滤行,请使用子查询或CTE。

您应该尝试使用临时表 (#table) 而不是表变量 (@table)。 SQL Server 始终将@table 估计为 1 行表,这可能会对您的查询性能产生很大影响。 使用#table 的另一个好处是您可以在其上创建索引;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM