[英]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
。 您应该尝试使用临时表 (#table) 而不是表变量 (@table)。 SQL Server 始终将@table 估计为 1 行表,这可能会对您的查询性能产生很大影响。 使用#table 的另一个好处是您可以在其上创建索引;)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.