Ich habe eine gespeicherte Prozedur, die Ergebnisse aus einer indizierten Ansicht über einen übergeordneten Index zurückgibt. Normalerweise läuft es schnell (~ 10ms), manchmal kann es bis zu 8 Sekunden dauern.
Hier ist ein Beispiel für eine zufällige Ausführung (Hinweis: Dies ist keine langsame Ausführung, aber der Abfragetext ist abgesehen vom übergebenen Wert derselbe):
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
Hier ist der 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);
(Anmerkung: Ich habe den OPTION (RECOMPILE)
Hinweis kürzlich nach einigem Rat hinzugefügt , aber es hat nicht geholfen.
Hier ist der Deckungsindex (Hinweis: Die Ansicht hat auch einen Clustered-Index ListingId
, der eindeutig ist)
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
Ich habe einen Profiler-Trace mit Showplan-XML-Statistiken erstellt.
Hier ist eine langsame (6 Sekunden) und der entsprechende Plan:
Sieht genau so aus, wie ich es erwartet habe, und ist der gleiche Plan, wenn die Abfrage schnell ist.
Hier ist die Vergrößerung des kostspieligen Teils des Plans, wenn das hilft:
Hier ist das vollständige Schema der Anzeige- / Sicherungstabellen, falls dies hilfreich ist: https://pastebin.com/wh1sRcbQ
Anmerkungen:
- Indizes wurden defragmentiert, Statistiken auf dem neuesten Stand.
- Ursprünglich war die Abfrage inline gegen die Ansicht, aber ich bin zu SPROC gewechselt, um zu versuchen, mich zu stabilisieren. Hat nicht geholfen.
- Hinzufügen eines
WITH OPTION (RECOMPILE);
Hinweises (hat nicht funktioniert, kann also kein Parameter-Sniffing durchgeführt werden?) - Andere Abfragen im System sind manchmal ebenfalls langsam und haben auch keine offensichtlichen Probleme in ihrem Plan.
- Könnte sperren? Ich weiß nicht, wie ich es bestätigen soll.
Irgendwelche Ideen, was ich als nächstes versuchen könnte?
Vielen Dank