添加索引执行计划后显示索引丢失

时间:2014-05-04 06:44:14

标签: sql sql-server

我正在使用sql server 2008..i为我的Transaction_tbl创建索引,如下所示:

CREATE INDEX INloc ON transaction_tbl
(
    Locid ASC
)

CREATE INDEX INDtim ON transaction_tbl
(
   DTime ASC
)

CREATE INDEX INStatus ON transaction_tbl
(
    Status ASC
)

CREATE INDEX INDelda ON transaction_tbl
(
     DelDate ASC
)

然后我检查了我的sql查询执行计划:但显示索引缺少enter image description here

我的查询是这样的:

SELECT [transactID]
      ,[TBarcode]
      ,[cmpid]
      ,[Locid]
      ,[PSID]
      ,[PCID]
      ,[PCdID]
      ,[PlateNo]
      ,[vtid]
      ,[Compl]
      ,[self]
      ,[LstTic]
      ,[Gticket]
      ,[Cticket]
      ,[Ecode]
      ,[dtime]
      ,[LICID]
      ,[PAICID]
      ,[Plot]
      ,[mkid]
      ,[mdlid]
      ,[Colid]
      ,[Comments]
      ,[Kticket]
      ,[PAmount]
      ,[Payid]
      ,[Paid]
      ,[Paydate]
      ,[POICID]
      ,[DelDate]
      ,[DelEcode]
      ,[PAICdate]
      ,[KeyRoomDate]
      ,[Status]
  FROM [dbo].[Transaction_tbl] where locid='9'

我想知道在添加索引之后为什么执行计划显示索引丢失如果我给出我的where条件:

where locid= 9 and status=5 and DelDate='2014-04-05 10:10:00' and dtime='2014-04-05 10:10:00'

然后没有显示索引丢失..这是怎么来的?如果有人知道请帮我澄清一下..

我的索引缺失细节是这样的:

/*
Missing Index Details from SQLQuery14.sql - WIN7-PC.Vallett (sa (67))
The Query Processor estimates that implementing the following index could improve the query cost by 71.5363%.
*/

/*
USE [Vallett]
GO
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[Transaction_tbl] ([Locid])
INCLUDE ([transactID],[TBarcode],[cmpid],[PSID],[PCID],[PCdID],[PlateNo],[vtid],[Compl],[self],[LstTic],[Gticket],[Cticket],[Ecode],[dtime],[LICID],[PAICID],[Plot],[mkid],[mdlid],[Colid],[Comments],[Kticket],[PAmount],[Payid],[Paid],[Paydate],[POICID],[DelDate],[DelEcode],[PAICdate],[KeyRoomDate],[Status])
GO
*/

1 个答案:

答案 0 :(得分:0)

SQL Server建议的索引与您已有的索引不同 - 您所拥有的索引仅在LocID上 - 而一个SQL Server建议包括一大堆额外的列,所以它将成为覆盖索引,例如您的SELECT语句只能从索引中得到满足。

使用现有索引,SELECT可能会使用INloc索引查找行 - ,以便能够返回您选择的所有列,它需要在实际的表数据中进行相当昂贵的键查找(最有可能进入聚簇索引)。

如果添加了SQL Server建议的索引,由于该索引本身将包含所需的所有列,因此不需要对数据页进行密钥查找,因此操作会更快。

所以也许您可以检查真的是否需要SELECT中的所有列,如果不是 - 请修改列列表。

但是:将这么多列添加到INCLUDE列表通常不是一个好主意。我认为这里的索引建议没有用,我忽略了这一点。

更新:,如果您的SELECT始终包含这四项标准

WHERE locid = 9 AND status = 5 AND DelDate='2014-04-05 10:10:00' AND dtime='2014-04-05 10:10:00'

那么也许您可以尝试使用包含所有四列的单个索引:

CREATE INDEX LocStatusDates 
ON transaction_tbl(Locid, Status, DelDate, dtime)