J'ai une procédure stockée qui renvoie les résultats d'une vue indexée via un index de couverture. Habituellement, il fonctionne rapidement (~ 10 ms), parfois il peut durer jusqu'à 8 secondes.
Voici un exemple d'exécution aléatoire (remarque: ce n'est pas lent, mais le texte de la requête est le même en dehors de la valeur transmise):
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
Voici le 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);
(Remarque: j'ai ajouté l' OPTION (RECOMPILE)
indice récemment après quelques conseils, mais cela n'a pas aidé.
Voici l'index de couverture (remarque: la vue possède également un index clusterisé ListingId
, qui est unique)
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
J'ai mis une trace de profileur, avec des statistiques XML showplan.
En voici un lent (6 secondes), et le plan pertinent:
Ressemble exactement à ce que j'attendais, et c'est le même plan lorsque la requête est rapide.
Voici le zoom sur la partie coûteuse du plan, si cela vous aide:
Voici le schéma complet des tables de visualisation / sauvegarde, si cela vous aide: https://pastebin.com/wh1sRcbQ
Remarques:
- Les index ont été défragmentés, les statistiques à jour.
- À l'origine, la requête était en ligne avec la vue, mais je suis passé à SPROC pour essayer de stabiliser. Ça n'a pas aidé.
- Ajout d'un
WITH OPTION (RECOMPILE);
indice (n'a pas fonctionné, ne peut donc pas être un reniflement de paramètre?) - D'autres requêtes dans le système s'exécutent également parfois lentement, et elles n'ont également aucun problème évident dans leur plan.
- Peut-être verrouillé? Je ne sais pas comment confirmer.
Des idées sur ce que je pourrais essayer ensuite?
Merci