Ho una procedura memorizzata che restituisce risultati da una vista indicizzata tramite un indice di copertura. Di solito, funziona veloce (~ 10ms), a volte può durare fino a 8 secondi.
Ecco un esempio di esecuzione casuale (nota: questa non è lenta, ma il testo della query è lo stesso a parte il valore passato):
declare @p2 dbo.IdentityType
insert into @p2 values(5710955)
insert into @p2 values(5710896)
insert into @p2 values(5710678)
insert into @p2 values(5710871)
insert into @p2 values(5711103)
insert into @p2 values(6215197)
insert into @p2 values(5710780)
exec ListingSearch_ByLocationAndStatus @statusType=1,@locationIds=@p2
Ecco lo SPROC:
ALTER PROCEDURE [dbo].[ListingSearch_ByLocationAndStatus]
@LocationIds IdentityType READONLY,
@StatusType TINYINT
AS
BEGIN
SET NOCOUNT ON;
SELECT -- lots of fields
FROM [dbo].[ListingSearchView][a] WITH (NOEXPAND)
INNER JOIN @LocationIds [b] ON [a].[LocationId] = [b].[Id]
WHERE [a].[StatusType] = @statusType
OPTION (RECOMPILE);
(nota: ho aggiunto il OPTION (RECOMPILE)
suggerimento di recente dopo alcuni consigli, ma non ha aiutato.
Ecco l'indice di copertura (nota: la vista ha anche un indice cluster su ListingId
, che è unico)
CREATE NONCLUSTERED INDEX [IX_ListingSearchView_ForAPI] ON [dbo].[ListingSearchView]
(
[LocationId] ASC,
[StatusType] ASC
)
INCLUDE ( -- all the fields in the query) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
GO
Ho messo su una traccia di profiler, con statistiche XML showplan.
Eccone uno lento (6 secondi) e il piano pertinente:
Sembra esattamente come mi sarei aspettato ed è lo stesso piano quando la query è veloce.
Ecco lo zoom sulla parte costosa del piano, se questo aiuta:
Ecco lo schema completo delle view / backing tables, se questo aiuta: https://pastebin.com/wh1sRcbQ
Gli appunti:
- Gli indici sono stati deframmentati, le statistiche aggiornate.
- Inizialmente la query era in linea con la vista, ma sono passato a SPROC per cercare di stabilizzare. Non ha aiutato
- Aggiunta di un
WITH OPTION (RECOMPILE);
suggerimento (non ha funzionato, quindi non è possibile annusare i parametri?) - Anche altre query nel sistema a volte funzionano lentamente e non hanno problemi evidenti nel loro piano.
- Potrebbe essere bloccato? Non sono sicuro di come confermare.
Qualche idea su cosa potrei provare dopo?
Grazie