查询运行速度很快:
DECLARE @SessionGUID uniqueidentifier
SET @SessionGUID = 'BCBA333C-B6A1-4155-9833-C495F22EA908'
SELECT *
FROM Report_Opener
WHERE SessionGUID = @SessionGUID
ORDER BY CurrencyTypeOrder, Rank
子树成本:0.502
但是将相同的SQL放在存储过程中运行速度很慢,并且执行计划完全不同
CREATE PROCEDURE dbo.ViewOpener @SessionGUID uniqueidentifier AS
SELECT *
FROM Report_Opener
WHERE SessionGUID = @SessionGUID
ORDER BY CurrencyTypeOrder, Rank
EXECUTE ViewOpener @SessionGUID
子树成本:19.2
我跑了
sp_recompile ViewOpener
它仍然运行相同(严重),我也已将存储过程更改为
CREATE PROCEDURE dbo.ViewOpener @SessionGUID uniqueidentifier AS
SELECT *, 'recompile please'
FROM Report_Opener
WHERE SessionGUID = @SessionGUID
ORDER BY CurrencyTypeOrder, Rank
然后再回来,试图真正欺骗它重新编译。
我已经删除并重新创建存储过程以使其生成新计划。
我尝试使用一个诱饵变量强制重新编译,并防止参数嗅探:
CREATE PROCEDURE dbo.ViewOpener @SessionGUID uniqueidentifier AS
DECLARE @SessionGUIDbitch uniqueidentifier
SET @SessionGUIDbitch = @SessionGUID
SELECT *
FROM Report_Opener
WHERE SessionGUID = @SessionGUIDbitch
ORDER BY CurrencyTypeOrder, Rank
我也尝试过定义存储过程WITH RECOMPILE:
CREATE PROCEDURE dbo.ViewOpener @SessionGUID uniqueidentifier
WITH RECOMPILE
AS
SELECT *
FROM Report_Opener
WHERE SessionGUID = @SessionGUID
ORDER BY CurrencyTypeOrder, Rank
所以它的计划永远不会被缓存,我尝试在执行时强制重新编译:
EXECUTE ViewOpener @SessionGUID WITH RECOMPILE
这没有帮助。
这没有帮助。
实体“ Report_Opener”是一个未编入索引的视图。该视图仅引用基础表。没有表包含计算列,索引或其他。
为了它的地狱我尝试创建视图
SET ANSI_NULLS ON
SET QUOTED_IDENTIFER ON
这没有解决它。
怎么样?
查询很快
将查询移动到视图,从视图中选择是快速的
从存储过程的视图中选择是慢40倍?
我尝试将视图的定义直接移动到存储过程中(违反了3个业务规则,并打破了重要的封装),这使得它只减慢了大约6倍。
为什么存储过程版本如此之慢?什么可能导致SQL Server运行ad-hoc SQL比不同类型的ad-hoc SQL更快?
我真的不愿意
在代码中嵌入SQL
完全改变代码
Microsoft SQL Server 2000 - 8.00.2050 (Intel X86)
Mar 7 2008 21:29:56
Copyright (c) 1988-2003 Microsoft Corporation
Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
但是,如果没有参数嗅探,那么SQL Server无法像运行查询的SQL Sever那样快速运行。
我的下一次尝试将有StoredProcedureA来电StoredProcedureB呼叫StoredProcedureC电话StoredProcedureD查询视图。
如果失败,请让存储过程调用存储过程,调用UDF,调用UDF,调用存储过程,调用UDF查询视图。