4

次のような Oralce クエリがあります。

Sub_query1
Union
Sub_query2;

クエリを並列化したい。Web で検索したところ、サブクエリが連続して実行されており、UNION は 2 つのサブクエリが完了するまで実行されないため、UNION を並列化できないと言う人もいます。そして彼らは、UNION は並列化できると言う人々です。私の質問は:

         (1) can a UNION query be parallezied? if yes, how? if no, why?
         (2) can I just parallelize the two sub queries?

Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production を使用しています

ありがとうございました!

4

3 に答える 3

3

2 つのクエリを同時に実行することと、クエリを並行して実行することを混同していると思います。SQL は記述言語であり、SQL エンジン/オプティマイザーによってコードに変換されます。このクエリ プランは、テーブルからのデータの取得、結合の実行、集計の実行など、さまざまなコンポーネントで構成されています。

Oracle は、ユニオン クエリのクエリ プランを生成します。クエリ プランの各コンポーネントは、使用可能なすべてのプロセッサを利用できます (適切な条件が満たされている場合)。ただし、各コンポーネントは基本的に一度に 1 つずつ実行されます (妥当な概算で)。したがって、クエリのコンポーネントは並列化されますが、2 つのサブクエリは同時に実行されません。

アドバイスを一つ。の使用を検討するときはいつでも、 も機能UNIONするかどうかを自問する必要がありますUNION ALL。はUNION ALL、最終結果セットで重複を削除する必要がないため、はるかに効率的です。

于 2012-10-17T18:13:20.043 に答える
2

はい、すでに発見したように、UNION クエリは並列で実行できます。

ここで何が起こっているのかを完全に理解するには、VLDB and Partitioning Guide で並列実行について読むことをお勧めします。

操作内の並列処理は、ほぼどこでも発生する可能性があります。相互操作の並列処理は、プロデューサーとコンシューマーの間でのみ発生します。この場合、UNION (コンシューマー) は常に並行して実行できることを意味します。各サブクエリ (プロデューサー) は並行して実行されますが、同時には実行されません。

以下の例で、クエリのアクティブなレポートを見ると、これが起こっていることがわかります。

--Create two simple tables
create table test1(a number);
create table test2(a number);

--Populate them with 10 million rows
begin
    for i in 1 .. 100 loop
        insert into test1 select level from dual connect by level <= 100000;
        insert into test2 select level from dual connect by level <= 100000;
    end loop;
end;
/
commit;

--Gather stats
begin
    dbms_stats.gather_table_stats(user, 'TEST1');
    dbms_stats.gather_table_stats(user, 'TEST2');
end;
/

--Run a simple UNION.
select /*+ parallel */ count(*) from
(
   select a from test1 join test2 using (a) where a <= 1000
   union
   select a from test2 join test1 using (a) where a <= 1000
);

--Find the SQL_ID by looking at v$sql, then get the active report
--(which must be saved and viewed in a browser)
select dbms_sqltune.report_sql_monitor(sql_id => 'bv5c18gyykntv', type => 'active')
from dual;

これが出力の一部です。読むのは難しいですが、計画の最初の 11 のステップである UNION がどのように実行されるかを示しています。最初のサブクエリ (次の 9 行) は、クエリの前半で実行されます。次に、クエリの後半で 2 番目のサブクエリ (最後の 9 行) が実行されます。 並列 UNION クエリのアクティブ レポート

于 2012-12-30T05:20:17.130 に答える
1

いくつかのテストを行い、実行計画を比較することで、最終的に次のようにユニオンを並列化する方法を見つけました。

select/* +parallel (Result) */ * from
(Sub_query1
Union
Sub_query2) Result;

こうすることで、時間もCPUもシリアル版の半分近くかかりました。両方のサブクエリに並列ヒントを追加しても、時間と CPU コストは変わりません。

于 2012-10-17T19:23:13.033 に答える