我有一张桌子:
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'
答案 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'