0

我有下表:

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

查询计划如下所示:

在此处输入图像描述

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

此查询通常需要 40 多秒才能执行,具体取决于服务器负载。我一直在想办法(通过创建某种索引)让 SQL Server 在 Marker 表上进行搜索。我什么都想不出来。也许没有办法,但我想我会先问。

4

1 回答 1

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 行才能找到最大值Id。通过反向扫描IX_Marker_Id索引,它可以在找到匹配时立即停止EquipmentID,这可能会更快。

于 2013-03-20T19:57:44.057 回答