SQL Server查询优化器如何从特定表的可用索引中选择非聚簇索引?

时间:2016-02-25 17:54:57

标签: sql sql-server sql-server-2012

我有 try{ int num[]={1,2,3,4}; System.out.println(num[5]); }catch(Exception e){ test.log(LogStatus.INFO/ERROR, ExceptionUtils.getStackTrace(e)); } 表的非聚集索引。

serviceregistration

查询1:

Index Name ---------------+ Column Name ----------------- + Index Type
IX_SERVICEREGISTRATION_I  |  SERREGNO                     | NONCLUSTERED   
IX_SERVICEREGISTRATION_II |  SERREGNO, SERCUSTID          | NONCLUSTERED
IX_SERVICEREGISTRATION_III|  PLACEID, JOBID, SERREGNO     | NONCLUSTERED

查询2:

Select CustomerName, Place 
From dbo.ServiceRegistration
Where SERREGNO = 'JAN1234' And PLACEID = 1

查询3:

Select CustomerName, Place 
From dbo.ServiceRegistration
Where SERREGNO = 'JAN1234' And SERCUSTID = 'A123'

以上创建的索引是否对这些查询有用?

1 个答案:

答案 0 :(得分:1)

  • 查询#1可以使用IX_SERVICEREGISTRATION_I
  • 查询#2可能会使用IX_SERVICEREGISTRATION_II
  • 查询#3可能使用索引#3

在查询中使用 n最左列时,只能使用任何复合索引(由多个列组成) - 这就是查询#1和查询#的原因2可以使用索引#3。

但是索引的实际使用将取决于更多的东西 - 比如你用这个查询选择了整个表中有多少行?

没有任何查询被“覆盖”和索引 - 例如没有查询可以通过查看索引来返回您要求的值 - 这通常会限制索引的有用性。如果您要为任何索引添加INCLUDE (CustomerName, Place) - 然后,那么它们使用的可能性就会大大提高。