SQL Serverは、Rebus
で使用されるMessagesテーブルと、SQLServerTransport
で使用されるMessagesテーブルに対して、私は現在のインデックスの設定が正しいと感じていますが、CTEの使用、削除、および出力に関する何かがSQL Serverに何かをさせる原因になっています。SQL ServerのRebus SqlServerTransport、 "MissingIndex"が正しくない、または何かが意図したとおりに動作していない
インデックスにSQL Serverが間違っていますか、ここで予期しないことをしているCTEはありますか?
SQL Serverは現在、クラスタ化インデックスが
PRIMARY KEY CLUSTERED
(
[recipient] ASC,
[priority] ASC,
[id] ASC
)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF,
IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
のようなもので、ここでは、このDBに対して実行されている唯一のクエリでいる
CREATE INDEX IX_<NewNameHere>
ON [MessageQueues].[dbo].[Messages] ([id])
INCLUDE ([recipient], [priority])
の線に沿って要求してインデックスされます。
exec sp_executesql N'SET NOCOUNT ON
;WITH TopCTE AS
(
SELECT TOP 1
[id], [headers], [body]
FROM
[Messages] M WITH (ROWLOCK, READPAST)
WHERE
M.[recipient] = @recipient
AND M.[visible] < getdate()
AND M.[expiration] > getdate()
ORDER BY
[priority] ASC, [id] ASC
)
DELETE FROM TopCTE
OUTPUT deleted.[id] as [id],
deleted.[headers] as [headers],
deleted.[body] as [body]
', N'@recipient nvarchar(200)', @recipient=N'Location'
アップデート: 私が欲しかったインデックスを引き起こしたクエリに間違っていました。 REBUSこのクエリ
` は[{_tableName}] FROM DELETE実行周期メッセージPerformExpiredMessagesCleanupCycle
[ID]( SELECT TOP 1 [ID]の[{_tableName}] FROM(ROWLOCK、READPAST WITHを行います所望インデックスがどこから来ている) [受信者] = @recipient AND [呼気] < GETDATE() )
`
です。
追加情報、SQL Server 2008 R2、サービスパックなし。 – XenoPuTtSs
SQL Server 2008 R2は、2016年と2008R2sp1に欠落しているインデックスが表示されているため、これに関連していないようです。 – XenoPuTtSs