0

このステートメントには奇妙なことがありますCOALESCE(@param_ids +'、'、'')

@param_idsはparamとして渡され、@ param_ids VARCHAR(MAX)です。

SQL-Serverが以下のシナリオのキャッシュプランを作成できなかった理由。この問題はMicrosoftにエスカレートされており、現在も作業中です。

動作しないシナリオ-キャッシュプランが生成されないステップ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  

ステップ2paramsを使用したExecSp

ステップ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

作業シナリオ-キャッシュプランが生成されますステップ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  

ステップ2paramsを使用したExecSp

ステップ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

ありがとう

4

1 に答える 1

0

WAITFOR を追加したところ、一貫して計画が立てられました。これはパラメータに依存しない必要があります

CREATE PROC dbo.testplan @param_ids varchar(max) OUTPUT
AS
IF (LTRIM(RTRIM(ISNULL(@param_ids,''))) = '')  
  BEGIN  
   SELECT @param_ids = COALESCE(@param_ids + ',', '') + CONVERT(VARCHAR(50),ID)  
   FROM [dbo].Content_Type WITH (NOLOCK)  
  END  
GO
CREATE PROC dbo.testplan2 @param_ids varchar(max) OUTPUT
AS
IF (LTRIM(RTRIM(ISNULL(@param_ids,''))) = '')  
  BEGIN  
   SELECT @param_ids = COALESCE(@param_ids + ',', '') + CONVERT(VARCHAR(50),ID)  
   FROM [dbo].Content_Type WITH (NOLOCK)  
  END  
GO

EXEC dbo.testplan 'bar'
GO
WAITFOR DELAY '00:00:02'
SELECT OBJECT_NAME([objectid]), *
FROM sys.dm_exec_cached_plans 
CROSS APPLY sys.dm_exec_sql_text(plan_handle) 
WHERE [dbid] = DB_ID()
AND [objectid] = OBJECT_ID('testplan')
GO

EXEC dbo.testplan2 ''
GO
WAITFOR DELAY '00:00:02'
SELECT OBJECT_NAME([objectid]), *
FROM sys.dm_exec_cached_plans 
CROSS APPLY sys.dm_exec_sql_text(plan_handle) 
WHERE [dbid] = DB_ID()
AND [objectid] = OBJECT_ID('testplan2')
GO
于 2011-02-02T07:19:15.587 に答える