1

次の表があります。

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
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO

そして、このクエリ:

Declare @EquipmentId nvarchar(50)

Set @EquipmentId = 'KLM52B-MARKER'

SELECT TOP 1 
    cr.C44DistId,
    cr.C473RightLotId
From Cache.Marker m
    INNER JOIN Cache.vwCoaterRecipe AS cr ON cr.MarkerId = m.ID
Where m.EquipmentID = @EquipmentId And m.ReadTime >= '3/1/2013'
ORDER BY m.Id desc  

生成されるクエリ プランは次のとおりです。

ここに画像の説明を入力

私の質問はこれです。別のインデックスのスキャンではなく、シークで Cache.Marker テーブルのクラスター化インデックスが使用されないのはなぜですか? さらに、SSMS クエリ アナライザーは、ID 列と EquipmentID 列を含む Marker.ReadTime にインデックスを追加することを提案しています。

Cache.Marker テーブルには約 100 万行あります。

4

1 に答える 1

3

固有の機器 ID はいくつありますか? おそらく、日付の方が最初のルックアップとして適切であると判断されます (おそらく誤って)。WITH( INDEX() )ステートメントを使用して、インデックスを使用するように強制できます。FORCESEEK同様に助けることができます。データベースのサイズが大きくなっても、インデックスの動作は予測可能であるため、これを強くお勧めします。

SELECT TOP 1 
    cr.C44DistId,
    cr.C473RightLotId
From Cache.Marker m
     WITH ( INDEX( IX_Marker_EquipmentID_ReadTime_SubID ), FORCESEEK )
    INNER JOIN Cache.vwCoaterRecipe AS cr 
    ON cr.MarkerId = m.ID
Where m.EquipmentID = @EquipmentId And m.ReadTime >= '3/1/2013'
ORDER BY m.Id desc  
于 2013-03-07T20:44:35.150 に答える