簡體   English   中英

我可以在 oracle 的一個聯合子句中使用不同的提示嗎

[英]can I use different hints in one clause of union in oracle

我有以下格式的合並查詢 -

merge into dest 
using (select /*+ use_hash(t1,t2) parallel (4)*/ t1_name ,count(*) from table1 , table2 on t1.col=t2.col
group by  t1_name) src
on (values)
when matched then update dest.col

現在我必須在這個查詢中做聯合

merge into dest 
using (select count(*),t1_name from (select /*+ use_hash(t1,t2) parallel (4)*/ t1_name ,count(*) from table1 , table2 on t1.col=t2.col
group by  t1_name
union all
select t1_name,count(*) from table t1 group by t1_name from table t1  group by t1_name ) group by t1_name) src
on (values)
when matched then update dest.col

我的問題是我是否也必須在第二個聯合條款中給出平行提示。 此外,之前運行良好的 use_hash 提示不會影響在查詢中添加聯合子句

這些提示分別適用於每個 select。 首先,您需要了解並行執行在 session 級別和/或應用提示方面的工作原理。

在這你有三個元素

  • 合並語句本身將更新一些行並且不會並行運行
  • 第一個數據集恢復與第一個 select 將並行運行
  • 由於應用到第一個語句的提示,第二個將並行運行

我假設這些表配置為 noparallel 並且您沒有啟用並行 dml。 我什至不會嘗試復制查詢,因為我不知道你想用它做什么。

測試用例

SQL> create table t1 ( c1 number, c2 number ) ;

Table created.

SQL> create table t2 ( c1 number, c3 number ) ;

Table created.

SQL> ed
Wrote file afiedt.buf

  1  declare
  2  begin
  3  for i in 1 .. 10000
  4  loop
  5   insert into t1 values ( i , dbms_random.value );
  6   insert into t2 values ( i , dbms_random.value );
  7  end loop;
  8* end;
SQL> /

PL/SQL procedure successfully completed.

SQL> ed
Wrote file afiedt.buf

  1  declare
  2  begin
  3  for i in 1 .. 10000
  4  loop
  5   insert into t1 values ( i , dbms_random.value );
  6  end loop;
  7* end;
SQL> /

PL/SQL procedure successfully completed.

SQL> select count(*) from t1 ;

  COUNT(*)
----------
     20000

SQL> select count(*) from t2 ;

  COUNT(*)
----------
     10000

現在我將使用基於聯合 select 的源構建一個合並語句來更新表 t2。 在這種情況下忘記查詢的含義,這根本沒有任何意義,而是產生的執行計划

SQL> merge into t dest
  2  using ( select distinct t1 from (
  3  select /*+ use_hash(t2,t1) parallel (4)*/ t1.c1 as t1 from t1 inner join t2 on ( t1.c1=t2.c1)
  4  union all
  5  select t2.c1 as t1 from t1 inner join t2 on ( t1.c1=t2.c1 )
  6   ))  src on ( src.t1 = dest.c1 )
  7* when matched then update set dest.c2 = dbms_random.value

10000 rows merged.


Execution Plan
----------------------------------------------------------
Plan hash value: 889987475

-----------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                           | Name     | Rows  | Bytes | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
-----------------------------------------------------------------------------------------------------------------------------
|   0 | MERGE STATEMENT                     |          | 10000 |   253K|    43   (3)| 00:00:01 |        |      |            |
|   1 |  MERGE                              | T        |       |       |            |          |        |      |            |
|   2 |   PX COORDINATOR                    |          |       |       |            |          |        |      |            |
|   3 |    PX SEND QC (RANDOM)              | :TQ10006 | 10000 |   498K|    43   (3)| 00:00:01 |  Q1,06 | P->S | QC (RAND)  |
|   4 |     VIEW                            |          |       |       |            |          |  Q1,06 | PCWP |            |
|*  5 |      HASH JOIN                      |          | 10000 |   498K|    43   (3)| 00:00:01 |  Q1,06 | PCWP |            |
|   6 |       PX RECEIVE                    |          | 10000 |   126K|    17   (6)| 00:00:01 |  Q1,06 | PCWP |            |
|   7 |        PX SEND BROADCAST            | :TQ10005 | 10000 |   126K|    17   (6)| 00:00:01 |  Q1,05 | P->P | BROADCAST  |
|   8 |         VIEW                        |          | 10000 |   126K|    17   (6)| 00:00:01 |  Q1,05 | PCWP |            |
|   9 |          HASH UNIQUE                |          | 10000 |   126K|    17   (6)| 00:00:01 |  Q1,05 | PCWP |            |
|  10 |           PX RECEIVE                |          | 10000 |   126K|    17   (6)| 00:00:01 |  Q1,05 | PCWP |            |
|  11 |            PX SEND HASH             | :TQ10004 | 10000 |   126K|    17   (6)| 00:00:01 |  Q1,04 | P->P | HASH       |
|  12 |             HASH UNIQUE             |          | 10000 |   126K|    17   (6)| 00:00:01 |  Q1,04 | PCWP |            |
|  13 |              VIEW                   |          | 40000 |   507K|    16   (0)| 00:00:01 |  Q1,04 | PCWP |            |
|  14 |               UNION-ALL             |          |       |       |            |          |  Q1,04 | PCWP |            |
|* 15 |                HASH JOIN            |          | 20000 |   507K|     8   (0)| 00:00:01 |  Q1,04 | PCWP |            |
|  16 |                 PX RECEIVE          |          | 10000 |   126K|     3   (0)| 00:00:01 |  Q1,04 | PCWP |            |
|  17 |                  PX SEND HASH       | :TQ10000 | 10000 |   126K|     3   (0)| 00:00:01 |  Q1,00 | P->P | HASH       |
|  18 |                   PX BLOCK ITERATOR |          | 10000 |   126K|     3   (0)| 00:00:01 |  Q1,00 | PCWC |            |
|  19 |                    TABLE ACCESS FULL| T2       | 10000 |   126K|     3   (0)| 00:00:01 |  Q1,00 | PCWP |            |
|  20 |                 PX RECEIVE          |          | 20000 |   253K|     5   (0)| 00:00:01 |  Q1,04 | PCWP |            |
|  21 |                  PX SEND HASH       | :TQ10001 | 20000 |   253K|     5   (0)| 00:00:01 |  Q1,01 | P->P | HASH       |
|  22 |                   PX BLOCK ITERATOR |          | 20000 |   253K|     5   (0)| 00:00:01 |  Q1,01 | PCWC |            |
|  23 |                    TABLE ACCESS FULL| T1       | 20000 |   253K|     5   (0)| 00:00:01 |  Q1,01 | PCWP |            |
|* 24 |                HASH JOIN            |          | 20000 |   507K|     8   (0)| 00:00:01 |  Q1,04 | PCWP |            |
|  25 |                 PX RECEIVE          |          | 10000 |   126K|     3   (0)| 00:00:01 |  Q1,04 | PCWP |            |
|  26 |                  PX SEND HASH       | :TQ10002 | 10000 |   126K|     3   (0)| 00:00:01 |  Q1,02 | P->P | HASH       |
|  27 |                   PX BLOCK ITERATOR |          | 10000 |   126K|     3   (0)| 00:00:01 |  Q1,02 | PCWC |            |
|  28 |                    TABLE ACCESS FULL| T2       | 10000 |   126K|     3   (0)| 00:00:01 |  Q1,02 | PCWP |            |
|  29 |                 PX RECEIVE          |          | 20000 |   253K|     5   (0)| 00:00:01 |  Q1,04 | PCWP |            |
|  30 |                  PX SEND HASH       | :TQ10003 | 20000 |   253K|     5   (0)| 00:00:01 |  Q1,03 | P->P | HASH       |
|  31 |                   PX BLOCK ITERATOR |          | 20000 |   253K|     5   (0)| 00:00:01 |  Q1,03 | PCWC |            |
|  32 |                    TABLE ACCESS FULL| T1       | 20000 |   253K|     5   (0)| 00:00:01 |  Q1,03 | PCWP |            |
|  33 |       PX BLOCK ITERATOR             |          | 94911 |  3522K|    26   (0)| 00:00:01 |  Q1,06 | PCWC |            |
|  34 |        TABLE ACCESS FULL            | T        | 94911 |  3522K|    26   (0)| 00:00:01 |  Q1,06 | PCWP |            |
-----------------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   5 - access("SRC"."T1"="DEST"."C1")
  15 - access("T1"."C1"="T2"."C1")
  24 - access("T1"."C1"="T2"."C1")

Note
-----
   - dynamic statistics used: dynamic sampling (level=2)
   - Degree of Parallelism is 4 because of hint
   - PDML is disabled in current session

下面是執行計划中最重要的部分:

  • 由於表格沒有統計,Oracle 使用了動態采樣。
  • 度數用在 4 因興。
  • 在 session 級別未啟用並行 DML,因此合並的更新結果以非並行方式運行。
  • Oracle 動態構建一個 VIEW 來加入並集的兩個數據集,因為其中一個是並行運行的,CBO 並行運行第二個,即使它沒有任何提示。
  • 在 USE_HASH 提示中,始終使用較小的表作為驅動表。 通常 CBO 會一直這樣做,所以我建議謹慎使用 USE_HASH 提示,因為如果較小的表增長到比第二個更大的點,您的提示會產生很多性能下降。

希望它澄清。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM