2011-11-23 18 views
0

私は並行して、クエリ1 & 2を実行したいとして、それらが終了した後、結果を組み合わせるでしょうのTransact SQLクエリの並列実行

INSERT INTO @tmp1 (ID) SELECT ID FROM Table1 WHERE Name = 'A' 
INSERT INTO @tmp2 (ID) SELECT ID FROM Table2 WHERE Name = 'B' 
SELECT ID FROM @tmp1 UNION ALL SELECT ID FROM @tmp3 

があるとします。

純粋なT-SQLでこれを行う方法、またはこれを自動的に行うかどうかを確認する方法はありますか?

希望する人物の背景:後で複数の条件(OR(term2 AND term3)OR term4 AND item5 = term5)が混在している複雑な検索を調査します。大部分無関係な条件を並行して実行し、後で結果として得られるテーブルを結合する(およびランク、重みなどを計算する)のに便利です。

など。

SELECT COUNT(*) @tmp1 union @tmp3 
SELECT ID from (@tmp1 union @tmp2) WHERE ... 
SELECT * from TABLE3 where ID IN (SELECT ID FROM @tmp1 union @tmp2) 
SELECT * from TABLE4 where ID IN (SELECT ID FROM @tmp1 union @tmp2) 
+0

@ Ioannis Karadimas:無関係です。並列性は、複数のスレッドを持つ1つのクエリです。パラレルクエリを持つ同じセッションではありません – gbn

+1

あなたは正しいです。私はコメントを削除しました。 –

+1

-1下記のコメントを参照 – gbn

答えて

2

SQL Serverのオプティマイザは、何を並列化するかを決めることはありません。オプティマイザが動作する最大の作業単位は1つのステートメントなので、という単一のステートメントというようにクエリを表現する方法を見つけてから、通常はSQL Serverを使用してその作業を行いますかなり良い。

クエリを作成してパフォーマンスが許容範囲外の場合は、ヒントを適用したり、特定のプランを強制的に使用することができます。多くの人がクエリを複数のステートメントに分割し、SQL Serverよりも優れた仕事をすることができると信じています。どちらも「間違っている」というのは間違っていますが、自然な内訳がある場合は、Common Table Expressionsを使用して複製することができます。これにより、問題の各部分に名前を付けて組み合わせることができます一緒に、すべて1つのステートメントの一部として。

など。:

;WITH TabA AS (
    SELECT ID FROM Table1 WHERE Name = 'A' 
), TabB AS (
    SELECT ID FROM Table2 WHERE Name = 'B' 
) 
SELECT ID FROM TabA UNION ALL SELECT ID FROM TabB 

そして、これは、サーバーが


はあなたの他のコメントの一つに見て(例えば「一時」の表の中間結果を保存するかどうかを決定する)最高このクエリを解決する方法を決定することができます中間結果を「処理」する必要があることについて議論しています。これはCTEで行うことができます(例:「最終」の結果を単一のクエリとして表現できない場合)。

;WITH TabA AS (
    SELECT ID FROM Table1 WHERE Name = 'A' 
), TabAWithCalcs AS (
    SELECT ID,(ID*5+6) as ModID from TabA 
) 
SELECT * FROM TabAWithCalcs 
+0

良い答え、私たちはdba.seのチャットhttp://chat.stackexchange.com/rooms/179/the-heapに参加する必要があります – gbn

+0

#tempテーブルがcteのものではなく(マテリアライゼーションのヒントがないために必要です)、 SQLサーバーが2つの一時表の作成を並列化するとは思わない。 SQLサーバーは、ほとんどの場合、1つのステートメントの範囲外のプロシージャーです。 – crokusek

3

あなたはそうではありません。 SQLはそのようには機能しません。プロシージャルではありません。

テーブル変数もバッチと接続にスコープが設定されているので、疑問に思っている場合に2つの接続で結果を共有することはできません。

SELECT ID FROM Table1 WHERE Name = 'A' 
UNION 
SELECT ID FROM Table2 WHERE Name = 'B' 

私はあなたがこのための手続き思考の「並列して実行」を考えている疑いがある:あなたが私たちに悪い例を与えない限り、いずれの場合においても

は、あなたが必要なのは、これです。あなたの 実際にはの問題と目標は何ですか?

注:SQL Serverが並列で2つの選択を実行したい場合、それは自身のviolitionで行います、その後

SELECT ID FROM Table1 WHERE Name = 'A' 
UNION ALL 
SELECT ID FROM Table2 WHERE Name = 'B' 

Can queries that read table variables generate parallel exection plans in SQL Server 2008?

+1

OPは2つの異なるテーブルを照会していますが、同じテーブルではありません。これは動作しません。 –

+0

@Chris J:ありがとう、それを逃した – gbn

+0

それはTable1とTable2です。例は2つの選択が関連していないことを説明するためのものです。私の実際の問題は、複雑な検索に対するすべての解決策を調べることです。 – queen3

1

理由だけではなく:テーブル変数は、並列操作を許可しません。

それ以外の場合は、これが現実的でない場合は、達成しようとしているものに対してさらに多くのコンテキストが必要です。

+0

マージする前に個々の結果を処理する必要があるかもしれないので、重みを計算してください。すべてにおいて、私は並列性のことに対する答えが必要です。 – queen3

+0

これ以上詳細が必要です。しかし、SQLと並列化することはできません。あなたがパラレルにしたいのであれば、それは(例えば)C#で書かれるクライアントコードの関数です。 2つの異なるスレッドでデータベースへの2つの接続をオープンしなければならず、結果はクライアント・ビジネス・ロジック内で管理されます。 –