2017-11-08 14 views
2

リモートWebサービスで計算を呼び出すSQLCLR関数としてテーブル値関数が構築されています。私はCROSS APPLY関数が関数を並行して呼び出すか、逐次的に呼び出すかどうか疑問に思っていましたか?SQLCLRテーブル値関数(TVF)で適用されるSQLクロス

計算をサポートするWebサービスが実際にスレッドセーフであるかどうかはわかりません。

クロス適用されたクエリ:

WITH listCTE AS 
(
SELECT 'definition1' AS def UNION ALL 
SELECT 'definition2' AS def UNION ALL 
SELECT 'definition3' AS def 
) 
SELECT calc.* 
FROM listCTE a 
CROSS APPLY dbo.f_webservice_calculate (a.def,'2017-06-30') calc 

SQLCLR TVF関数定義。

[SqlFunction(
    Name = "f_webservice_calculate", 
    DataAccess = DataAccessKind.Read, 
    FillRowMethodName = "fillRowMethod",   
    SystemDataAccess = SystemDataAccessKind.Read 
)] 
public static IEnumerable f_webservice_calculate(string def, DateTime date) 
{ 
...calling web service using HttpWebRequest 
} 

答えて

2

私はCROSS APPLYが平行に行うか、できない場合はわからないが、あなたはそれがないことを確認する必要がある場合、あなたはの底にOPTION (MAXDOP 1)を追加することにより、シングルスレッドのままにクエリを強制することができますクエリ。

また、SQLCLRを経由してWebサービスを呼び出すことに関して、私は次のような答え、特に約ServicePointManager 1とあれば、手動で増やす必要があるだけでのデフォルトの同時接続の制限に言及した勧告を参照してください。それは重要なものだとの質問には

SQL CLR Web Service Call: Limiting Overhead

2

+1:あなたはすでに外部リソースを呼び出すだけでやっているよりも、不注意問合せにはるかに大きなボトルネックを導入する必要はありません。この記事では、トピックに関するいくつかの有益な情報があります。Forcing a Parallel Query Execution Plan Paul White

パラレル・インヒビター(スカラーUDFまたはシステム・テーブル・アクセスなど)がない場合、照会オプティマイザーはいくつかの要因に基づいて並列または直列計画を選択するオプションを持っています。

CROSS APPLY関数が の関数を並列に呼び出すのか、それともシーケンシャルな方法で呼び出すのでしょうか?

APPLYは(CROSSが適用および外側の適用あり)table operatorだけJOIN、PIVOTとUNPIVOTのようなものです。オプティマイザは、CROSS APPLYがmulti-statement table valued functionインラインテーブル値関数は問題ありません)を参照している場合を除いて、シリアルまたはパラレルプランを選択するテーブル演算子については何もありません。ソロモンが述べたように、あなたはシリアル計画を強制的にOPTION(MAXDOP 1)を使用することができますシリアルまたはパラレル計画

を強制

。クエリーの最後に(文書化されていない)8649トレースフラグを使用して、並列プランを強制的に追加することができます(OPTION (QUERYTRACEON 8649))。オプティマイザは、であれば、並列プランを選択するように強制します。 traceflag 8649を使用していてもシリアル・プランを取得している場合は、並列性を阻害するコンポーネントがあることがわかります。

トレースフラグ8649の代替として、Adam Machanicのmake_parallelを使用することができます。

+0

お返事ありがとうございます。 SQLCLR関数が複数ステートメントのテーブル値関数と見なされると思いますか?私の実際の実行計画(MAXDOP 1なし)は、あなたが投稿した記事によると、MTVF実行計画のように見えるテーブル値関数を呼び出すネストループです。 – Vincent

関連する問題