Bo's Oracle Station

查看: 1095|回复: 0

SQL改写案例

[复制链接]

1005

主题

1469

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
12012
发表于 2022-5-15 17:17:57 | 显示全部楼层 |阅读模式
  1. oradebug setospid 45744416
  2. oradebug unlimit
  3. oradebug event 10053 trace name context forever,level 1
复制代码

  1. SELECT ch.channel_class, c.cust_city, t.calendar_quarter_desc,
  2. SUM(s.amount_sold) sales_amount
  3. FROM
  4. sh.sales s,sh.times t,sh.customers c,sh.channels ch
  5. WHERE s.time_id = t.time_id AND
  6. s.cust_id = c.cust_id AND
  7. s.channel_id = ch.channel_id AND
  8. c.cust_state_province = 'CA' AND
  9. ch.channel_desc IN ('Internet','Catalog') AND
  10. t.calendar_quarter_desc IN ('2002-01','2002-02')
  11. GROUP BY ch.channel_class, c.cust_city, t.calendar_quarter_desc;
复制代码
  1. alter session set events '10053 trace name context forever, level 1';
复制代码

1. 特别简单又容易忽视的场景:
准备环境:
  1. SQL> create table t3( a  varchar2(20)) ;
  2. Table created.
  3. SQL> begin
  4.   2   for i in 1..100000
  5.   3   loop
  6.   4    insert into t3 values(to_char(i));
  7.   5   end loop;
  8.   6   commit;
  9.   7  end;
  10.   8  /
  11. PL/SQL procedure successfully completed.
复制代码
  1. SQL> create index i3 on t3(a) ;
  2. Index created.
复制代码
测试执行计划1:
  1. SQL> set autot on
  2. SQL> select * from t3 where a=999;
  3. A
  4. --------------------
  5. 999
  6. Execution Plan
  7. ----------------------------------------------------------
  8. Plan hash value: 4161002650
  9. --------------------------------------------------------------------------
  10. | Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time         |
  11. --------------------------------------------------------------------------
  12. |   0 | SELECT STATEMENT  |         |     3 |    36 |    69   (2)| 00:00:01 |
  13. |*  1 |  TABLE ACCESS FULL| T3         |     3 |    36 |    69   (2)| 00:00:01 |
  14. --------------------------------------------------------------------------
  15. Predicate Information (identified by operation id):
  16. ---------------------------------------------------
  17. 1 - filter(TO_NUMBER("A")=999)
  18. Note
  19. -----
  20.    - dynamic statistics used: dynamic sampling (level=2)
  21.    - automatic DOP: Computed Degree of Parallelism is 1 because of parallel threshold

  22. Statistics
  23. ----------------------------------------------------------
  24.           8  recursive calls
  25.           5  db block gets
  26.         243  consistent gets
  27.           0  physical reads
  28.        1008  redo size
  29.         544  bytes sent via SQL*Net to client
  30.         390  bytes received via SQL*Net from client
  31.           2  SQL*Net roundtrips to/from client
  32.           0  sorts (memory)
  33.           0  sorts (disk)
  34.           1  rows processed
复制代码
测试执行计划2:
  1. SQL> select * from t3 where a='999';
  2. A
  3. --------------------
  4. 999
  5. Execution Plan
  6. ----------------------------------------------------------
  7. Plan hash value: 2553414617
  8. -------------------------------------------------------------------------
  9. | Id  | Operation         | Name | Rows        | Bytes | Cost (%CPU)| Time        |
  10. -------------------------------------------------------------------------
  11. |   0 | SELECT STATEMENT |        |     1 |    12 |     1   (0)| 00:00:01 |
  12. |*  1 |  INDEX RANGE SCAN| I3        |     1 |    12 |     1   (0)| 00:00:01 |
  13. -------------------------------------------------------------------------
  14. Predicate Information (identified by operation id):
  15. ---------------------------------------------------
  16.    1 - access("A"='999')
  17. Note
  18. -----
  19.    - dynamic statistics used: dynamic sampling (level=2)
  20.    - automatic DOP: Computed Degree of Parallelism is 1 because of parallel threshold
  21. Statistics
  22. ----------------------------------------------------------
  23.           9  recursive calls
  24.           0  db block gets
  25.          52  consistent gets
  26.           1  physical reads
  27.           0  redo size
  28.         544  bytes sent via SQL*Net to client
  29.         392  bytes received via SQL*Net from client
  30.           2  SQL*Net roundtrips to/from client
  31.           0  sorts (memory)
  32.           0  sorts (disk)
  33.           1  rows processed
复制代码

2. 关联子查询改写(顺便研究sql 10046 trace):
LISTPRICE_RELATE的trace:
  1. SQL> conn sh/oracle_4U@rcat
  2. Connected.
  3. SQL> alter session set tracefile_identifier='LISTPRICE_RELATE';
  4. Session altered.
  5. SQL> alter session set sql_trace=true;
  6. Session altered.
  7. SQL> select /*LISTJOIN_RELATE*/ count(*) from products p
  8.    where  p.prod_list_price < 1.15*(select  avg(unit_cost) avg from costs c
  9.                                                           where c.prod_id=p.prod_id);  2    3  
  10. COUNT(*)
  11. ----------
  12.         46
  13. SQL>  alter session set sql_trace=false;
  14. Session altered.
复制代码
LISTPRICE_JOIN的trace:
  1. SQL> conn sh/oracle_4U@rcat
  2. Connected.
  3. SQL> alter session set tracefile_identifier='LISTPRICE_JOIN';
  4. Session altered.
  5. SQL> alter session set sql_trace=true;
  6. Session altered.
  7. SQL> select /*LISTPRICE_JOIN*/ count(*)  from products p,
  8.   (select  prod_id,avg(unit_cost) avg from costs  group by prod_id) a
  9.   where p.prod_id=a.prod_id and
  10.              p.prod_list_price < 1.15* a.avg;  2    3    4  
  11.   COUNT(*)
  12. ----------
  13.         46
  14. SQL>  alter session set    sql_trace=false;
  15. Session altered.
复制代码
/u01/app/oracle/diag/rdbms/rcat/rcat/trace:
  1. [oracle@cvcdds198 trace]$ ls *LISTPRICE*
  2. rcat_ora_1519515_LISTPRICE_RELATE.trc  rcat_ora_1536602_LISTPRICE_JOIN.trc
  3. rcat_ora_1519515_LISTPRICE_RELATE.trm  rcat_ora_1536602_LISTPRICE_JOIN.trm
复制代码
trcsess合并:
  1. [oracle@cvcdds198 trace]$ trcsess output=/home/oracle/LISTPRICE.trc service=rcat.example.com rcat_ora_1519515_LISTPRICE_RELATE.trc rcat_ora_1536602_LISTPRICE_JOIN.trc
复制代码
tkprof解读:
  1. [oracle@cvcdds198 ~]$ tkprof /home/oracle/LISTPRICE.trc /home/oracle/report.txt explain=sh/oracle_4U@rcat
复制代码
  1. ********************************************************************************

  2. select /*LISTPRICE_JOIN*/ count(*)  from products p,
  3.   (select  prod_id,avg(unit_cost) avg from costs  group by prod_id) a
  4.   where p.prod_id=a.prod_id and
  5.              p.prod_list_price < 1.15* a.avg

  6. call     count       cpu    elapsed       disk      query    current        rows
  7. ------- ------  -------- ---------- ---------- ---------- ----------  ----------
  8. Parse        1      0.03       0.03          0       2778          0           0
  9. Execute      1      0.00       0.00          0          0          0           0
  10. Fetch        2      0.00       0.00          0         19          0           1
  11. ------- ------  -------- ---------- ---------- ---------- ----------  ----------
  12. total        4      0.04       0.04          0       2797          0           1

  13. Misses in library cache during parse: 1
  14. Optimizer mode: ALL_ROWS
  15. Parsing user id: 105  (SH)
  16. Number of plan statistics captured: 1

  17. Rows (1st) Rows (avg) Rows (max)  Row Source Operation
  18. ---------- ---------- ----------  ---------------------------------------------------
  19.          1          1          1  SORT AGGREGATE (cr=68 pr=0 pw=0 time=11765 us starts=1)
  20.         46         46         46   HASH JOIN  (cr=68 pr=0 pw=0 time=11773 us starts=1 cost=17 size=140 card=4)
  21.         72         72         72    TABLE ACCESS FULL PRODUCTS (cr=3 pr=0 pw=0 time=81 us starts=1 cost=3 size=648 card=72)
  22.         72         72         72    VIEW  (cr=16 pr=0 pw=0 time=6535 us starts=1 cost=14 size=1872 card=72)
  23.         72         72         72     HASH GROUP BY (cr=16 pr=0 pw=0 time=6521 us starts=1 cost=14 size=648 card=72)
  24.       1068       1068       1068      PARTITION RANGE ALL PARTITION: 1 28 (cr=16 pr=0 pw=0 time=7629 us starts=1 cost=13 size=739008 card=82112)
  25.       1068       1068       1068       TABLE ACCESS INMEMORY FULL COSTS PARTITION: 1 28 (cr=16 pr=0 pw=0 time=5671 us starts=28 cost=13 size=739008 card=82112)


  26. Rows     Execution Plan
  27. -------  ---------------------------------------------------
  28.       0  SELECT STATEMENT   MODE: ALL_ROWS
  29.       1   SORT (AGGREGATE)
  30.      46    HASH JOIN
  31.      72     TABLE ACCESS   MODE: ANALYZED (FULL) OF 'PRODUCTS' (TABLE)
  32.      72     VIEW
  33.      72      HASH (GROUP BY)
  34.    1068       PARTITION RANGE (ALL) PARTITION: START=1 STOP=28
  35.    1068        TABLE ACCESS   MODE: ANALYZED (INMEMORY FULL) OF
  36.                    'COSTS' (TABLE) PARTITION: START=1 STOP=28
复制代码
  1. ********************************************************************************

  2. select /*LISTJOIN_RELATE*/ count(*) from products p
  3.    where  p.prod_list_price < 1.15*(select  avg(unit_cost) avg from costs c
  4.                                                           where c.prod_id=p.prod_id)

  5. call     count       cpu    elapsed       disk      query    current        rows
  6. ------- ------  -------- ---------- ---------- ---------- ----------  ----------
  7. Parse        1      0.01       0.01          0         58          0           0
  8. Execute      1      0.00       0.00          0          0          0           0
  9. Fetch        2      0.00       0.00          0         19          0           1
  10. ------- ------  -------- ---------- ---------- ---------- ----------  ----------
  11. total        4      0.02       0.02          0         77          0           1

  12. Misses in library cache during parse: 1
  13. Optimizer mode: ALL_ROWS
  14. Parsing user id: 105  (SH)
  15. Number of plan statistics captured: 1

  16. Rows (1st) Rows (avg) Rows (max)  Row Source Operation
  17. ---------- ---------- ----------  ---------------------------------------------------
  18.          1          1          1  SORT AGGREGATE (cr=19 pr=0 pw=0 time=7879 us starts=1)
  19.         46         46         46   HASH JOIN  (cr=19 pr=0 pw=0 time=7882 us starts=1 cost=17 size=140 card=4)
  20.         72         72         72    NESTED LOOPS  (cr=16 pr=0 pw=0 time=7567 us starts=1 cost=17 size=140 card=4)
  21.         72         72         72     NESTED LOOPS  (cr=16 pr=0 pw=0 time=7493 us starts=1)
  22.         72         72         72      STATISTICS COLLECTOR  (cr=16 pr=0 pw=0 time=7490 us starts=1)
  23.         72         72         72       VIEW  VW_SQ_1 (cr=16 pr=0 pw=0 time=7381 us starts=1 cost=14 size=1872 card=72)
  24.         72         72         72        HASH GROUP BY (cr=16 pr=0 pw=0 time=7362 us starts=1 cost=14 size=648 card=72)
  25.       1068       1068       1068         PARTITION RANGE ALL PARTITION: 1 28 (cr=16 pr=0 pw=0 time=8594 us starts=1 cost=13 size=739008 card=82112)
  26.       1068       1068       1068          TABLE ACCESS INMEMORY FULL COSTS PARTITION: 1 28 (cr=16 pr=0 pw=0 time=6363 us starts=28 cost=13 size=739008 card=82112)
  27.          0          0          0      INDEX UNIQUE SCAN PRODUCTS_PK (cr=0 pr=0 pw=0 time=0 us starts=0)(object id 92749)
  28.          0          0          0     TABLE ACCESS BY INDEX ROWID PRODUCTS (cr=0 pr=0 pw=0 time=0 us starts=0 cost=3 size=9 card=1)
  29.         72         72         72    TABLE ACCESS FULL PRODUCTS (cr=3 pr=0 pw=0 time=46 us starts=1 cost=3 size=648 card=72)


  30. Rows     Execution Plan
  31. -------  ---------------------------------------------------
  32.       0  SELECT STATEMENT   MODE: ALL_ROWS
  33.       1   SORT (AGGREGATE)
  34.      46    HASH JOIN
  35.      72     NESTED LOOPS
  36.      72      NESTED LOOPS
  37.      72       STATISTICS COLLECTOR
  38.      72        VIEW OF 'VW_SQ_1' (VIEW)
  39.      72         HASH (GROUP BY)
  40.    1068          PARTITION RANGE (ALL) PARTITION: START=1 STOP=28
  41.    1068           TABLE ACCESS   MODE: ANALYZED (INMEMORY FULL) OF
  42.                       'COSTS' (TABLE) PARTITION: START=1 STOP=28
  43.       0       INDEX   MODE: ANALYZED (UNIQUE SCAN) OF 'PRODUCTS_PK'
  44.                   (INDEX (UNIQUE))
  45.       0      TABLE ACCESS   MODE: ANALYZED (BY INDEX ROWID) OF
  46.                  'PRODUCTS' (TABLE)
  47.      72     TABLE ACCESS   MODE: ANALYZED (FULL) OF 'PRODUCTS' (TABLE)

  48. ********************************************************************************
复制代码
  1. SQL>  select 'OK' from dual where exists (select a from t3 where rownum=1);
  2. 'O
  3. --
  4. OK
  5. Execution Plan
  6. ----------------------------------------------------------
  7. Plan hash value: 1170111551
  8. --------------------------------------------------------------------
  9. | Id  | Operation            | Name | Rows  | Cost (%CPU)| Time           |
  10. --------------------------------------------------------------------
  11. |   0 | SELECT STATEMENT    |           |         1 |         4   (0)| 00:00:01 |
  12. |*  1 |  FILTER             |           |           |                |           |
  13. |   2 |   FAST DUAL            |           |         1 |         2   (0)| 00:00:01 |
  14. |*  3 |   COUNT STOPKEY     |           |           |                |           |
  15. |   4 |    TABLE ACCESS FULL| T3   | 81798 |         2   (0)| 00:00:01 |
  16. --------------------------------------------------------------------
  17. Predicate Information (identified by operation id):
  18. ---------------------------------------------------
  19.    1 - filter( EXISTS (SELECT 0 FROM "T3" "T3" WHERE ROWNUM=1))
  20.    3 - filter(ROWNUM=1)
  21. Note
  22. -----
  23.    - dynamic statistics used: dynamic sampling (level=2)
  24.    - automatic DOP: Computed Degree of Parallelism is 1 because of parallel threshold
  25. Statistics
  26. ----------------------------------------------------------
  27.           7  recursive calls
  28.           0  db block gets
  29.           8  consistent gets
  30.           0  physical reads
  31.           0  redo size
  32.         546  bytes sent via SQL*Net to client
  33.         431  bytes received via SQL*Net from client
  34.           2  SQL*Net roundtrips to/from client
  35.           0  sorts (memory)
  36.           0  sorts (disk)
  37.           1  rows processed
  38. SQL> select 'OK' from dual where (select  count(*) from t3) >=1 ;
  39. 'O
  40. --
  41. OK
  42. Execution Plan
  43. ----------------------------------------------------------
  44. Plan hash value: 1926481175
  45. --------------------------------------------------------------------
  46. | Id  | Operation            | Name | Rows  | Cost (%CPU)| Time           |
  47. --------------------------------------------------------------------
  48. |   0 | SELECT STATEMENT    |           |         1 |        70   (0)| 00:00:01 |
  49. |*  1 |  FILTER             |           |           |                |           |
  50. |   2 |   FAST DUAL            |           |         1 |         2   (0)| 00:00:01 |
  51. |   3 |   SORT AGGREGATE    |           |         1 |                |           |
  52. |   4 |    TABLE ACCESS FULL| T3   | 81798 |        68   (0)| 00:00:01 |
  53. --------------------------------------------------------------------
  54. Predicate Information (identified by operation id):
  55. ---------------------------------------------------
  56. 1 - filter( (SELECT COUNT(*) FROM "T3" "T3")>=1)
  57. Note
  58. -----
  59.    - dynamic statistics used: dynamic sampling (level=2)
  60.    - automatic DOP: Computed Degree of Parallelism is 1 because of parallel threshold
  61. Statistics
  62. ----------------------------------------------------------
  63.           4  recursive calls
  64.           0  db block gets
  65.         193  consistent gets
  66.           0  physical reads
  67.           0  redo size
  68.         546  bytes sent via SQL*Net to client
  69.         421  bytes received via SQL*Net from client
  70.           2  SQL*Net roundtrips to/from client
  71.           0  sorts (memory)
  72.           0  sorts (disk)
  73.           1  rows processed
复制代码

3 . with clause:
  1. SQL> set linesize 10000
  2. SQL> set autot traceonly
  3. SQL> select prod_id, amount_sold from sales
  4.   2   where amount_sold= (select max(amount_sold) from sales)
  5.   3  union all
  6.   4  select prod_id, amount_sold from sales
  7.   5   where amount_sold= (select min(amount_sold) from sales)
  8.   6  union all
  9.   7  select prod_id, amount_sold from sales
  10.   8   where amount_sold= (select avg(amount_sold) from sales)
  11.   9  ;

  12. 292 rows selected.


  13. Execution Plan
  14. ----------------------------------------------------------
  15. Plan hash value: 3943716753

  16. -------------------------------------------------------------------------------------------------
  17. | Id  | Operation               | Name  | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
  18. -------------------------------------------------------------------------------------------------
  19. |   0 | SELECT STATEMENT        |       |  1536 | 13824 | 26734   (1)| 00:00:02 |       |       |
  20. |   1 |  UNION-ALL              |       |       |       |            |          |       |       |
  21. |   2 |   PARTITION RANGE ALL   |       |   512 |  4608 |  4457   (1)| 00:00:01 |     1 |    28 |
  22. |*  3 |    TABLE ACCESS FULL    | SALES |   512 |  4608 |  4457   (1)| 00:00:01 |     1 |    28 |
  23. |   4 |     SORT AGGREGATE      |       |     1 |     5 |            |          |       |       |
  24. |   5 |      PARTITION RANGE ALL|       |  1837K|  8973K|  4454   (1)| 00:00:01 |     1 |    28 |
  25. |   6 |       TABLE ACCESS FULL | SALES |  1837K|  8973K|  4454   (1)| 00:00:01 |     1 |    28 |
  26. |   7 |   PARTITION RANGE ALL   |       |   512 |  4608 |  4457   (1)| 00:00:01 |     1 |    28 |
  27. |*  8 |    TABLE ACCESS FULL    | SALES |   512 |  4608 |  4457   (1)| 00:00:01 |     1 |    28 |
  28. |   9 |     SORT AGGREGATE      |       |     1 |     5 |            |          |       |       |
  29. |  10 |      PARTITION RANGE ALL|       |  1837K|  8973K|  4454   (1)| 00:00:01 |     1 |    28 |
  30. |  11 |       TABLE ACCESS FULL | SALES |  1837K|  8973K|  4454   (1)| 00:00:01 |     1 |    28 |
  31. |  12 |   PARTITION RANGE ALL   |       |   512 |  4608 |  4457   (1)| 00:00:01 |     1 |    28 |
  32. |* 13 |    TABLE ACCESS FULL    | SALES |   512 |  4608 |  4457   (1)| 00:00:01 |     1 |    28 |
  33. |  14 |     SORT AGGREGATE      |       |     1 |     5 |            |          |       |       |
  34. |  15 |      PARTITION RANGE ALL|       |  1837K|  8973K|  4454   (1)| 00:00:01 |     1 |    28 |
  35. |  16 |       TABLE ACCESS FULL | SALES |  1837K|  8973K|  4454   (1)| 00:00:01 |     1 |    28 |
  36. -------------------------------------------------------------------------------------------------

  37. Predicate Information (identified by operation id):
  38. ---------------------------------------------------

  39.    3 - filter("AMOUNT_SOLD"= (SELECT MAX("AMOUNT_SOLD") FROM "SALES" "SALES"))
  40.    8 - filter("AMOUNT_SOLD"= (SELECT MIN("AMOUNT_SOLD") FROM "SALES" "SALES"))
  41.   13 - filter("AMOUNT_SOLD"= (SELECT AVG("AMOUNT_SOLD") FROM "SALES" "SALES"))

  42. Note
  43. -----
  44.    - automatic DOP: Computed Degree of Parallelism is 1 because of parallel threshold


  45. Statistics
  46. ----------------------------------------------------------
  47.           0  recursive calls
  48.           0  db block gets
  49.       39680  consistent gets
  50.           0  physical reads
  51.           0  redo size
  52.        5765  bytes sent via SQL*Net to client
  53.         761  bytes received via SQL*Net from client
  54.          21  SQL*Net roundtrips to/from client
  55.           0  sorts (memory)
  56.           0  sorts (disk)
  57.         292  rows processed
复制代码
  1. SQL> with s as ( select  max(amount_sold) max,
  2.   2                      min(amount_sold) min,
  3.   3                      avg(amount_sold) avg
  4.   4             from sales)
  5.   5  select prod_id, amount_sold from sales
  6.   6   where amount_sold in (select  max from s union all select  min from s union all select avg from s )
  7.   7  ;

  8. 292 rows selected.


  9. Execution Plan
  10. ----------------------------------------------------------
  11. Plan hash value: 2588622809

  12. ------------------------------------------------------------------------------------------------------------------------
  13. | Id  | Operation                  | Name                      | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
  14. ------------------------------------------------------------------------------------------------------------------------
  15. |   0 | SELECT STATEMENT           |                           |  1537 | 33814 |  8920   (1)| 00:00:01 |       |       |
  16. |   1 |  TEMP TABLE TRANSFORMATION |                           |       |       |            |          |       |       |
  17. |   2 |   LOAD AS SELECT           | SYS_TEMP_0FD9D663D_1F26D4 |       |       |            |          |       |       |
  18. |   3 |    SORT AGGREGATE          |                           |     1 |     5 |            |          |       |       |
  19. |   4 |     PARTITION RANGE ALL    |                           |  1837K|  8973K|  4454   (1)| 00:00:01 |     1 |    28 |
  20. |   5 |      TABLE ACCESS FULL     | SALES                     |  1837K|  8973K|  4454   (1)| 00:00:01 |     1 |    28 |
  21. |*  6 |   HASH JOIN                |                           |  1537 | 33814 |  4465   (1)| 00:00:01 |       |       |
  22. |   7 |    VIEW                    | VW_NSO_1                  |     3 |    39 |     6   (0)| 00:00:01 |       |       |
  23. |   8 |     HASH UNIQUE            |                           |     3 |    39 |     6   (0)| 00:00:01 |       |       |
  24. |   9 |      UNION-ALL             |                           |       |       |            |          |       |       |
  25. |  10 |       VIEW                 |                           |     1 |    13 |     2   (0)| 00:00:01 |       |       |
  26. |  11 |        TABLE ACCESS FULL   | SYS_TEMP_0FD9D663D_1F26D4 |     1 |     5 |     2   (0)| 00:00:01 |       |       |
  27. |  12 |       VIEW                 |                           |     1 |    13 |     2   (0)| 00:00:01 |       |       |
  28. |  13 |        TABLE ACCESS FULL   | SYS_TEMP_0FD9D663D_1F26D4 |     1 |     5 |     2   (0)| 00:00:01 |       |       |
  29. |  14 |       VIEW                 |                           |     1 |    13 |     2   (0)| 00:00:01 |       |       |
  30. |  15 |        TABLE ACCESS FULL   | SYS_TEMP_0FD9D663D_1F26D4 |     1 |     5 |     2   (0)| 00:00:01 |       |       |
  31. |  16 |    PARTITION RANGE ALL     |                           |  1837K|    15M|  4454   (1)| 00:00:01 |     1 |    28 |
  32. |  17 |     TABLE ACCESS FULL      | SALES                     |  1837K|    15M|  4454   (1)| 00:00:01 |     1 |    28 |
  33. ------------------------------------------------------------------------------------------------------------------------

  34. Predicate Information (identified by operation id):
  35. ---------------------------------------------------

  36.    6 - access("AMOUNT_SOLD"="MAX")

  37. Note
  38. -----
  39.    - automatic DOP: Computed Degree of Parallelism is 1 because of parallel threshold


  40. Statistics
  41. ----------------------------------------------------------
  42.           2  recursive calls
  43.           8  db block gets
  44.       13251  consistent gets
  45.           1  physical reads
  46.         624  redo size
  47.        6707  bytes sent via SQL*Net to client
  48.         761  bytes received via SQL*Net from client
  49.          21  SQL*Net roundtrips to/from client
  50.           0  sorts (memory)
  51.           0  sorts (disk)
  52.         292  rows processed
复制代码
4. merge:
  1. SQL> create table t1 (a varchar2(20), b number);
  2. Table created.
  3. SQL> create table t2 (a varchar2(20), b number);
  4. Table created.
  5. SQL> insert into t1 values('a', 1) ;   
  6. 1 row created.
  7. SQL> insert into t1 values('b', 2);
  8. 1 row created.
  9. SQL> insert into t1 values('c', 3);
  10. 1 row created.
  11. SQL>  insert into t1 values('xxx',100);
  12. 1 row created.
  13. SQL> insert into t1 values('yyy',200);
  14. 1 row created.
  15. SQL> commit;
  16. Commit complete.
  17. SQL> insert into t2 values ('a',10);
  18. 1 row created.
  19. SQL> insert into t2 values ('b',20);
  20. 1 row created.
  21. SQL> insert into t2 values ('xxx',30);
  22. 1 row created.
  23. SQL> insert into t2 values ('yyy',40);
  24. 1 row created.
  25. SQL> commit;
  26. Commit complete.
复制代码
  1. merge into t2
  2. using t1
  3. on (t1.a=t2.a)
  4. when matched then
  5. update
  6. set t2.b=t1.b*2
复制代码
  1. merge into t2
  2. using t1
  3. on (t1.a=t2.a)
  4. when matched then
  5. update
  6. set t2.b=t1.b*2
  7. where t1.a='xxx'
复制代码

  1. merge into t2
  2. using t1
  3. on (t1.a=t2.a)
  4. when matched then
  5. update
  6. set t2.b=t1.b*2
  7. delete where t2.a='yyy'
复制代码

  1. merge into t2
  2. using t1
  3. on (  1<>1)
  4. when not matched then
  5. insert
  6. values (t1.a, t1.b)
复制代码



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Bo's Oracle Station   

GMT+8, 2024-4-27 19:56 , Processed in 0.098178 second(s), 24 queries .

快速回复 返回顶部 返回列表