0
有一些奇怪的这一说法 COALESCE(@param_ids + '', '')SP缓存计划
@param_ids在为PARAM过去了,有@param_ids VARCHAR(MAX)
任何想法为什么SQL-Server无法为以下情况生成缓存计划。 这个问题已经被微软列为他们仍在使用它。
不工作情况下 - 未缓存计划生成 步骤1
改变SP
IF (LTRIM(RTRIM(ISNULL(@param_ids,''))) = '')
BEGIN
SELECT @param_ids = COALESCE(@param_ids + ',', '') + CONVERT(VARCHAR(50),ID)
FROM [dbo].Content_Type WITH (NOLOCK)
END
步骤2 Exec的SP使用参数
步骤3(否缓存计划)
SELECT *
FROM sys.dm_exec_cached_plans
CROSS APPLY sys.dm_exec_sql_text(plan_handle)
WHERE [dbid] = DB_ID('databasename')
AND [objectid] = OBJECT_ID('databasename.dbo.us_spname')
GO
工作场景 - 缓存p LAN产生 步骤1
改变SP
IF (LTRIM(RTRIM(ISNULL(@param_ids,''))) = '')
BEGIN
--SELECT @param_ids = COALESCE(@param_ids + ',', '') + CONVERT(VARCHAR(50),ID)
--FROM [dbo].Content_Type WITH (NOLOCK)
SELECT @param_ids = COALESCE('aaaaaaa' + ',', '') + CONVERT(VARCHAR(50),ID)
FROM [dbo].Content_Type WITH (NOLOCK)
END
步骤2 Exec的SP使用参数
步骤3(高速缓存计划退出)
SELECT *
FROM sys.dm_exec_cached_plans
CROSS APPLY sys.dm_exec_sql_text(plan_handle)
WHERE [dbid] = DB_ID('databasename')
AND [objectid] = OBJECT_ID('databasename.dbo.us_spname')
GO
Thankx
虽然我尝试在我的本地我得到不同的dbID和DB_ID('databasename')。请在您的select语句中包含DB_ID('databasename'),OBJECT_ID('databasename.dbo.us_spname')我认为它们可能会不同于这两种情况 – 2011-02-02 06:28:02