我有下表:
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表上进行搜索。我还没有能够拿出任何东西。也许没有办法,但我想我先问。
答案 0 :(得分:1)
Marker
表上唯一包含EquipmentID
和Id
列的索引是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
后立即停止,这可能会更快。