我可以为此查询创建什么索引?

时间:2013-03-20 19:39:09

标签: sql-server-2008

我有下表:

CREATE TABLE [Cache].[Marker](
    [ID] [int] NOT NULL,
    [SubID] [varchar](15) NOT NULL,
    [ReadTime] [datetime] NOT NULL,
    [EquipmentID] [varchar](25) NULL,
    [Sequence] [int] NULL
) ON [PRIMARY]

以下索引:

CREATE UNIQUE CLUSTERED INDEX [IX_Marker_EquipmentID_ReadTime_SubID] ON [Cache].[Marker] 
(
    [EquipmentID] ASC,
    [ReadTime] ASC,
    [SubID] ASC
)

CREATE NONCLUSTERED INDEX [IX_Marker_Id] ON [Cache].[Marker] 
(
    [ID] ASC
)
INCLUDE ( [EquipmentID]) 

CREATE NONCLUSTERED INDEX [IX_Marker_SubID] ON [Cache].[Marker] 
(
    [SubID] ASC
)
INCLUDE ( [EquipmentID],[ReadTime]) 

我正在执行以下查询:

Declare @EquipmentId varchar(50)

SELECT TOP 1 
    C44DistId,
    C471DistId,
    C473RightLotId
From Cache.vwMarker m
    INNER JOIN Cache.vwCoaterRecipe AS cr ON cr.MarkerId = m.ID AND M.EquipmentID = @EquipmentId
Order By m.Id Desc

查询计划如下所示:

enter image description here

Marker表大约有7M行,因此扫描非常昂贵。 7M行中只有24个唯一的EquipmentId值,这可能就是扫描的原因。

此查询通常需要40多秒才能执行,具体取决于服务器负载。我一直试图想办法(通过创建某种索引)让SQL Server在Marker表上进行搜索。我还没有能够拿出任何东西。也许没有办法,但我想我先问。

1 个答案:

答案 0 :(得分:1)

Marker表上唯一包含EquipmentIDId列的索引是IX_Marker_Id。由于此索引没有EquipmentID作为第一列,因此您无法进行搜索;您必须以相反的顺序扫描索引,以找到匹配EquipmentID的第一个条目。

这样的事情可能有所帮助:

CREATE NONCLUSTERED INDEX [IX_Marker_EquipmentID_Id] ON [Cache].[Marker] 
(
   [EquipmentID] ASC,
   [ID] DESC
)

编辑:当然,您的聚集索引包含两列,但只有24个不同的EquipmentID值,它必须扫描超过290000行才能找到最大值{{1} }。通过反向扫描Id索引,它可以在找到匹配的IX_Marker_Id后立即停止,这可能会更快。

相关问题