커버링 인덱스를 통해 인덱싱 된 뷰에서 결과를 반환하는 저장 프로 시저가 있습니다. 일반적으로 빠르게 (~ 10ms) 실행되며 때로는 최대 8 초까지 실행될 수 있습니다.
다음은 임의 실행의 예입니다 (참고 : 속도는 느리지 않지만 쿼리 텍스트는 전달 된 값과 동일합니다).
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
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);
(참고 : OPTION (RECOMPILE)
최근에 조언을 한 후에 힌트를 추가 했지만 도움이되지 않았습니다.
커버링 인덱스는 다음과 같습니다 (참고 : 뷰에는 클러스터 된 인덱스도 있습니다. ListingId
고유)
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
실행 계획 XML 통계와 함께 프로파일 러 추적을 설정했습니다.
예상대로 정확하게 보이고 쿼리가 빠를 때와 동일한 계획입니다.
도움이 될 경우 계획에서 비용이 많이 드는 부분을 확대하면 다음과 같습니다.
도움이되는 경우보기 / 백업 테이블의 전체 스키마는 다음과 같습니다. https://pastebin.com/wh1sRcbQ
노트:
- 인덱스가 조각 모음되어 통계가 최신 상태입니다.
- 원래 쿼리는 뷰와 인라인되었지만 SPROC로 이동하여 안정화하려고 시도했습니다. 도움이되지 않았습니다.
WITH OPTION (RECOMPILE);
힌트 추가 (작동하지 않았으므로 매개 변수 스니핑 할 수 없습니까?)- 시스템의 다른 쿼리도 때때로 느리게 실행되며 계획에 명백한 문제가 없습니다.
- 잠글 수 있습니까? 확인 방법을 잘 모르겠습니다.
다음에 시도 할 수있는 아이디어가 있습니까?
감사