内连接时非聚集索引的查询性能
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
还是where
。 b
中的行将使用二级索引找到。这适用于任何合理的执行计划。
是的,查询将被视为SELECT * FROM ( SELECT * FROM Account WHERE SubscriberID = @subID ) A CROSS JOIN ( SELECT * FROM Subscriber WHERE SubscriberID = @subID ) S
- 对基表的两个谓词都可以满足索引搜索,但要考虑索引是否覆盖和预期的行数
以上是关于内连接时非聚集索引的查询性能的主要内容,如果未能解决你的问题,请参考以下文章