Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何使用复合索引减少表上的扫描计数?_Sql_Sql Server - Fatal编程技术网

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

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

我们有一个表(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列的索引,但没有帮助(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

索引中的列的顺序是什么?顺序是ID2,ID1。这有关系吗?这正是我(拙劣地)描述的尝试过的索引。扫描计数仍为数百。是的,T上有一个聚集索引。聚集索引包括ID1和ID2。如果@a中有300行,则您正在进行内部联接,如果@a和T之间有一对一的匹配,SQL Server将从T中读取300行。我遗漏了什么?答案似乎是我在一个旧的假设下,即扫描计数意味着全表扫描。我在谷歌上搜索过som,现在才意识到这仅仅意味着表的访问——所以问题一开始就不存在了。但你的指数建议显然是答案,如果它不存在的话。所以我认为你的答案是正确的。很抱歉。
select a.id as id1,
       (select t.id2
        from t
        where t.id1 = a.id
       ) as id2
from @a a;