我在银行工作。我们有一个包含40亿条记录的表,我为三列创建了一个非聚集索引:ACNO, HisDate, BranchNo
。
我的问题是,如果运行此查询
SELECT *
FROM dbo.LastBalance
WHERE HisDate = '20170813'
AND BranchNo = '0512'
SQL Server是否使用该索引?
我应该在WHERE
子句中使用三列,直到SQL Server使用索引?
列序列在WHERE
cluase中是否重要?
谢谢。
答案 0 :(得分:4)
如果索引真的是以这种方式创建的:
CREATE INDEX (name) ON dbo.YourTable(ACNO, HisDate, BranchNo)
然后可以使用,如果:
WHERE
子句ACNO
和HisDate
ACNO
但是 从不 会在您的情况下使用 - 如果您指定 n最左侧,则仅可以使用 索引中的列(这适用于所有复合索引 - 使用多个列的索引)。
您仅使用HisDate
和BranchNo
- 但您没有指定ACNO
,因此该索引无用,永远不会被使用。你应该在(HisDate, BranchNo)
- 上有一个有用的索引
答案 1 :(得分:1)
可能不是。 Oracle对其索引进行了“跳过扫描”操作。我不认为SQL Server实现了这样的功能。
查询的最佳索引将HisDate
和BranchNo
作为索引中的前两列(按任意顺序排列)。