【问题标题】: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

【问题讨论】:

    标签: sql sql-server database query-optimization


    【解决方案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 - 对基表的两个谓词都可以满足索引搜索,但要考虑索引是否覆盖和预期的行数
    猜你喜欢
    • 2014-11-04
    • 2013-03-14
    • 2011-10-12
    • 2012-04-30
    • 1970-01-01
    • 2023-03-23
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多