select查询是否会获得创建索引的好处?

时间:2018-01-18 08:07:32

标签: sql sql-server

我有一张桌子:

 CREATE TABLE EmployeeDetails
 (
   EmpID Integer Primary Key,
   EmpName Varchar(500),
   CreateDate DateTime,
   Location  Varchar(500)
  )

并且,我在其上创建了索引:

 CREATE INDEX IX_IndexName1 ON EmployeeDetails (CreateDate,Location)

我想知道下面提到的查询是否会获得索引IX_IndexName1的好处?

SELECT *
FROM   EmployeeDetails
WHERE  CreateDate >= '2017-05-01' AND CreateDate <= '2018-01-31'

1 个答案:

答案 0 :(得分:3)

由于SELECT *选择了表格中的所有列,您的查询将不太可能使用您当前的索引。

要成为覆盖索引,索引必须包含where子句中的所有列,select etc。

但如果它足够有选择性,它只会使用索引,即它会将结果数据过滤到足够小的行子集。

您应该检查实际执行计划(并确保您的统计信息是最新的)。

What are Covering Indexes and Covered Queries in SQL Server?

您的查询应使用以下索引(但始终检查实际计划):

CREATE INDEX IX_CreateDate_Location_I_EmpName_EmpID
ON EmployeeDetails (CreateDate)
INCLUDE (Location, EmpName, EmpID)

[注意:假设您的主键列是聚簇索引(默认情况下是未指定的),您不必在{{1}中明确包含EmpId } clause。]

如果您想要一个也可以由INCLUDE以及Location过滤的查询使用的索引,请创建此索引:

CreateDate

可以在索引的前导列CREATE INDEX IX_CreateDate_Location_I_EmpName_EmpID ON EmployeeDetails (CreateDate, Location) INCLUDE (EmpName, EmpID) 使用的位置使用索引,但如果查询不包含前导列则不使用索引。例如,此查询将无法使用我定义的任何索引(在大多数情况下):

'CreateDate'