Mam procedurę składowaną, która zwraca wyniki z widoku indeksowanego za pomocą indeksu obejmującego. Zwykle działa szybko (~ 10 ms), czasem może działać nawet do 8 sekund.
Oto przykład losowego wykonania (uwaga: to nie jest powolne, ale tekst zapytania jest taki sam, z wyjątkiem przekazywanej wartości):
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
Oto 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);
(uwaga: dodałem OPTION (RECOMPILE)
wskazówkę niedawno po kilku radach, ale to nie pomogło.
Oto indeks obejmujący (uwaga: widok ma również indeks klastrowany ListingId
, który jest unikalny)
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
Włączyłem śledzenie profilera ze statystykami showplan XML.
Oto powolny (6 sekund) i odpowiedni plan:
Wygląda dokładnie tak, jak się spodziewałem i jest taki sam plan, gdy zapytanie jest szybkie.
Oto powiększenie kosztownej części planu, jeśli to pomaga:
Oto pełny schemat tabel widoku / kopii zapasowej, jeśli to pomaga: https://pastebin.com/wh1sRcbQ
Uwagi:
- Indeksy zostały zdefragmentowane, statystyki są aktualne.
- Pierwotnie zapytanie było wbudowane w widok, ale przeniosłem się do SPROC, aby spróbować ustabilizować. Nie pomogło
- Dodanie
WITH OPTION (RECOMPILE);
podpowiedzi (nie działało, więc nie może być wąchanie parametru?) - Inne zapytania w systemie również czasami działają wolno i nie mają też żadnych oczywistych problemów w swoim planie.
- Może być blokowany? Nie jestem pewien, jak to potwierdzić.
Jakieś pomysły na to, co mogę spróbować dalej?
Dzięki