Sql 如何使用复合索引减少表上的扫描计数?
我们有一个表(T),大约有300万行,只有两个INT列(ID1和ID2),它们一起被设置为一个复合聚集键 在存储过程的早期,我们创建了一个表变量(@a),它由一个int列表组成 慢查询如下所示Sql 如何使用复合索引减少表上的扫描计数?,sql,sql-server,Sql,Sql Server,我们有一个表(T),大约有300万行,只有两个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列的索引,但没有帮助(ExecutionPlann
SELECT T.ID1, T.ID2
FROM T
INNER JOIN @A AS A
ON A.ID = T.ID1
@A只有几百行,而T包含几百万行。问题是T的扫描计数是几百。我不知道怎样才能让它消失
我尝试在T上创建另一个包含ID1和ID2列的索引,但没有帮助(ExecutionPlanner显示使用了新索引)
如何减少表T上的扫描计数
(我们正在使用SQL Server 2014,Web版)尝试创建一个包含索引(覆盖索引):
这将允许您的查询在索引页中查找所需的所有内容,而不必在主表中搜索。顺便问一下,表t上有聚集索引吗?您可以尝试使用如下语句来表示查询:
select a.id as id1,
(select t.id2
from t
where t.id1 = a.id
) as id2
from @a a;
这应该扫描@a
,并使用索引进行查找
注二:
- 如果可以有多个匹配项,请改用交叉应用
- 如果不存在匹配项,并且要筛选行,请使用子查询或CTE
select a.id as id1,
(select t.id2
from t
where t.id1 = a.id
) as id2
from @a a;