Tengo un procedimiento almacenado que devuelve los resultados de una vista indexada a través de un índice de cobertura. Por lo general, funciona rápido (~ 10 ms), a veces puede durar hasta 8 segundos.
Aquí hay un ejemplo de ejecución aleatoria (nota: esta no es lenta, pero el texto de la consulta es el mismo aparte del valor pasado):
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
Aquí está el 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: agregué la OPTION (RECOMPILE)
pista recientemente después de algunos consejos, pero no ha ayudado.
Aquí está el índice de cobertura (nota: la vista también tiene un índice agrupado ListingId
, que es único)
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
Puse un rastreador de perfil, con estadísticas de showplan XML.
Aquí hay uno lento (6 segundos) y el plan relevante:
Se ve exactamente como esperaba, y es el mismo plan cuando la consulta es rápida.
Aquí está el acercamiento a la parte costosa del plan, si eso ayuda:
Aquí está el esquema completo de las tablas de vista / respaldo, si eso ayuda: https://pastebin.com/wh1sRcbQ
Notas:
- Los índices han sido desfragmentados, las estadísticas actualizadas.
- Originalmente, la consulta estaba en línea con la vista, pero me mudé a SPROC para tratar de ayudar a estabilizar. No ha ayudado
- Agregar
WITH OPTION (RECOMPILE);
sugerencia (no funcionó, ¿no puede ser el rastreo de parámetros?) - Otras consultas en el sistema también a veces se ejecutan lentamente, y tampoco tienen problemas obvios en su plan.
- Podría estar bloqueando? No estoy seguro de cómo confirmar.
¿Alguna idea de lo que podría probar a continuación?
Gracias