内连接时非聚集索引的查询性能

Posted

技术标签:

【中文标题】内连接时非聚集索引的查询性能【英文标题】:Query performance of non clustered index during inner join 【发布时间】:2020-05-05 07:16:30 【问题描述】:

我们在一个内部连接查询中有两个表。当两个表中都有数百万条记录时,建议使用以下哪个选项以获得高性能。

注意:我们在外键列上有一个非聚集索引。我们没有足够的数据来验证开发环境中的性能。此外,可能会有更多的表通过 INNER 或 LEFT 连接进入此连接。

表格:

Subscriber(SID(PK), Name)
Account(AID(PK),SID(FK), AName)

查询:

SELECT *
FROM Account A
INNER JOIN Subscriber S ON S.SubscriberID=  A.SubscriberID
WHERE 
S.SubscriberID = @subID -- option 1
A.SubscriberID = @subID -- option 2

【问题讨论】:

【参考方案1】:

将谓词放在哪个列上应该没有任何区别。

SQL Server 可以看到S.SubscriberID= A.SubscriberID 条件并为其他列创建一个“隐含谓词”。

这确实变成了一个交叉连接(在两边过滤的行之间),然后是discussed here

【讨论】:

当我想到这一点时,我认为这没有什么不同。 a 中的行将使用主键索引找到——无论是通过on 还是whereb 中的行将使用二级索引找到。这适用于任何合理的执行计划。 是的,查询将被视为SELECT * FROM ( SELECT * FROM Account WHERE SubscriberID = @subID ) A CROSS JOIN ( SELECT * FROM Subscriber WHERE SubscriberID = @subID ) S - 对基表的两个谓词都可以满足索引搜索,但要考虑索引是否覆盖和预期的行数

以上是关于内连接时非聚集索引的查询性能的主要内容,如果未能解决你的问题,请参考以下文章

探究SQL添加非聚集索引,性能提高几十倍之谜

SQL Server 非聚集索引的覆盖,连接交叉和过滤

堆上的非聚集索引与聚集索引的性能 [关闭]

表上999个非聚集索引——你怎么看?

索引的概述

10-04索引的概述