3

与えられた:

CREATE PROCEDURE [dbo].[my_storedproc]
  @param1 int, @param2 varchar(100)
AS 
<<whatever>>
GO

これらの異なる実行方法の間に既知のパフォーマンスの違いはありますか?:

-- Method #1:
declare @param1 int = 1
declare @param2 varchar(100) = 'hello'  
exec my_storedproc @param1, @param2

-- Method #2:  
exec my_storedproc @param1=1, @param2='hello'

-- Method #3:  
declare @param1 int = 1
declare @param2 varchar(100) = 'hello'  
declare @procname nvarchar(100) = N'my_storedproc @param1, @param2'
declare @params nvarchar(4000) = N'@param1 int, @param2 varchar(100)'  
exec sp_executesql @procname, @params, @param1, @param2

-- Method #4:  
declare @procname nvarchar(4000) = N'my_storedproc @param1=1, @param2=''hello'''
exec sp_executesql @procname

-- Method #5:  
declare @procname nvarchar(4000) = N'my_storedproc 1, ''hello'''
exec sp_executesql @procname

-- Method #6:  
declare @procname nvarchar(4000) = N'my_storedproc 1, ''hello'''
exec (@procname)

"なぜ聞くのですか?" あなたが尋ねる?メタデータに完全に基づいてストアド プロシージャを一般的に実行する方法を見つけようとしています。他のすべての構成された (メタデータで) ストアド プロシージャを物理的に実行する制御ストアド プロシージャは、メタデータで定義されているもの以外は何も知りません。このコントローラーSP内では、呼び出す必要がある可能性のあるすべてのストアドプロシージャに必要な特定の物理パラメーター(必要なデータ型を含む)を(実際的な意味で)知​​り、宣言することはできません-それらを実行する方法を見つけようとしています完全に一般的ですが、うまくいけばまともなパフォーマンスを維持します(クエリプランの再利用など)。

4

1 に答える 1

1

6 つのオプションはすべてストアド プロシージャを実行しており、SQL ステートメントを直接実行するわけではないため、実際には 6 つのオプション間にパフォーマンスの違いはないはずです。

ただし、これを独自のシステムでテストすることほど、パフォーマンスを示すものはありません。すでに 6 つのテスト ケースがあるので、それぞれを試すのは難しくありません。

このコントローラー SP 内では、呼び出す必要がある可能性のあるすべてのストアド プロシージャに必要な特定の物理パラメーター (必要なデータ型を含む) を (実際的な意味で) 知り、宣言することはできません。

なぜだめですか?次のクエリのいずれかの出力に基づいて、方法 2 および 3 の SQL を動的に生成できなかった理由がわかりません。

SELECT OBJECT_NAME(sp.[object_id]), *
FROM   sys.parameters sp
WHERE  sp.[object_id] = OBJECT_ID(N'dbo.my_storedproc');

SELECT isp.*
FROM   INFORMATION_SCHEMA.PARAMETERS isp
WHERE  isp.[SPECIFIC_NAME] = N'my_storedproc'
AND    isp.[SPECIFIC_SCHEMA] = N'dbo';

そして、その情報を使用して、各 proc の各パラメーターのさまざまなパラメーター値を含むテーブルを作成できます。実際、すべてのバリエーションに対して「グローバル」値を持ついくつかのパラメータを設定し、一部のパラメータ値を特定のプロシージャのバリエーションにすることもできます。

于 2015-03-11T19:40:45.167 に答える