SQL Server сообщает, что для таблицы сообщений, используемой Rebus
, а для нее SQLServerTransport
нужен другой индекс, созданный для него. Я считаю, что текущая установка индекса правильная, но что-то об использовании CTE, удалении и выводе вызывает SQL Server что-то делать.Rebus SqlServerTransport, «MissingIndex» из SQL Server кажется неправильным или что-то не работает должным образом
Является ли SQL Server неправильным в индексе или CTE делает что-то неожиданное здесь?
SQL Server запрашивает и индекс по линиям
CREATE INDEX IX_<NewNameHere>
ON [MessageQueues].[dbo].[Messages] ([id])
INCLUDE ([recipient], [priority])
, где в настоящее время кластерный индекс, как
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]
и здесь единственный запрос быть побежал против этой БД.
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'
Update: Я был неправ на запросе, который вызывал разыскиваемый индекс. Ребус делает периодическое сообщение PerformExpiredMessagesCleanupCycle
, который работает с этим запросом
`` ` DELETE FROM [{_tableName}] ГДЕ [ID] IN ( Выбор TOP 1 [ID] ОТ [{_tableName}] С (ROWLOCK, READPAST) гДЕ [получатель] = @recipient И [истечения] < GETDATE() )
`` `
где полезный индекс откуда.
Дополнительная информация, SQL Server 2008R2, без пакетов обновления. – XenoPuTtSs
SQL Server 2008R2, похоже, не связан с этим, так как отсутствующий индекс появляется в 2016 и 2008R2sp1. – XenoPuTtSs