我有一个存储过程,该过程通过覆盖索引从索引视图返回结果。通常,它运行速度很快(〜10毫秒),有时甚至可以运行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
我使用showplan XML统计信息进行了探查器跟踪。
看起来完全符合我的预期,并且在查询快速时是相同的计划。
如果有帮助,以下是视图/支持表的完整架构:https : //pastebin.com/wh1sRcbQ
笔记:
- 索引已进行碎片整理,统计数据是最新的。
- 最初,查询是针对视图进行内联的,但是我搬到了SPROC来尝试并帮助稳定。没有帮助。
- 添加
WITH OPTION (RECOMPILE);
提示(行不通,所以不能进行参数嗅探吗?) - 系统中的其他查询有时也会运行缓慢,并且在计划中也没有明显的问题。
- 可以锁定吗?不确定如何确认。
关于下一步我可以尝试的任何想法?
谢谢