【问题标题】:How SQL Server uses its IndexSQL Server 如何使用它的索引
【发布时间】:2023-03-29 20:14:01
【问题描述】:

我在一家银行工作。我们有一个包含 40 亿条记录的表,我为三列创建了一个非聚集索引:ACNO, HisDate, BranchNo

我的问题是,如果运行此查询

SELECT * 
FROM dbo.LastBalance 
WHERE HisDate = '20170813' 
  AND BranchNo = '0512'

SQL Server 是否使用该索引?

在 SQL Server 使用索引之前,我应该在 WHERE 子句中使用三列吗?
WHERE cluase 中的列顺序重要吗?
谢谢。

【问题讨论】:

    标签: sql sql-server indexing


    【解决方案1】:

    如果索引真的是这样创建的:

    CREATE INDEX (name) ON dbo.YourTable(ACNO, HisDate, BranchNo)
    

    那么它可能被使用,如果:

    • 您在WHERE 子句中使用全部其中三个列
    • 如果您只使用ACNOHisDate
    • 如果你只使用ACNO

    但它永远不会在您的情况下使用 - 如果您指定 n 最左侧,它只能使用 索引中的列(这适用于 所有 复合索引 - 使用多于一列的索引)。

    您只使用了HisDateBranchNo - 但您没有指定ACNO,因此该索引无用并且永远不会被使用。您应该在 (HisDate, BranchNo) 上有一个索引 - 会有所帮助

    【讨论】:

      【解决方案2】:

      可能不会。 Oracle 在其索引上有一个“跳过扫描”操作。我不认为 SQL Server 实现了这样的东西。

      查询的最佳索引将HisDateBranchNo 作为索引中的前两列(按任意顺序)。

      【讨论】:

        猜你喜欢
        • 2017-10-24
        • 2011-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-18
        • 1970-01-01
        相关资源
        最近更新 更多