我有这个存储过程..当我告诉开发人员不推荐使用 Recompile 选项时,他们回答说“这是因为可以使用许多不同的参数调用这个 SP,我们希望优化器获取一个新计划每次调用(不理想,但与使用旧的缓存计划相比,这是一次尝试让它运行得更可靠、速度更快)”
他们说的对吗?有什么方法可以不用重新编译就可以做到这一点
create PROCEDURE [dbo].[VERIFIER_QUEUE]
@cas_name varchar(20) = NULL,
@instance_name varchar(50) = NULL,
@verifier_id int = NULL,
@applicant_type VARCHAR(20) = NULL
WITH RECOMPILE
AS
BEGIN
SET NOCOUNT ON
DECLARE @cas_name_x varchar(20)
DECLARE @instance_name_x varchar(50)
DECLARE @verifier_id_x int
DECLARE @InstanceId INT
...............
Run Code Online (Sandbox Code Playgroud) performance sql-server optimization execution-plan query-performance
我一直在努力使这个查询更有效地工作。
我发现 where 子句中 Or 的数量是这个查询中最大的问题。此查询位于存储过程中。
我到了我能想到的唯一选择的地步。:
我相信其他人以前也遇到过这个问题。查询性能在大约一秒或更短的时间内开始并不可怕,但在某些情况下,它被多次命中,导致长达 5 或 6 秒的延迟。
查询如下。:
DECLARE @PERSON_ID AS INT
DECLARE @ITEM_ID AS INT
DECLARE @ITEM_VERSION AS INT
DECLARE @ITEM_SUB_NAME AS VARCHAR(250)
DECLARE @ITEM_SUB_SUB_NAME AS VARCHAR(250)
--DEFAULTS
SET @PERSON_ID = 0
SET @ITEM_ID = 0
SET @ITEM_VERSION = 1
SET @ITEM_SUB_NAME = NULL
SET @ITEM_SUB_SUB_NAME = NULL
SELECT ID, PERSON_ID,
ISNULL(ITEM_VERSION, 1) AS ITEM_VERSION,
ISNULL(ITEM_SUB_NAME, '') AS 'ITEM_SUB_NAME',
ISNULL(ITEM_SUB_SUB_NAME, '') AS 'ITEM_SUB_SUB_NAME',
ISNULL(ITEM_DATE, '1/1/1900') AS …
Run Code Online (Sandbox Code Playgroud)