成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Oracle使用并行踩過的坑

數據庫 Oracle
并行處理的機制實際上就是把一個要掃描的數據集分成很多小數據集,Oracle會根據初始化參數 PARALLEL_MIN_SERVERS=n的值啟動幾個并行服務進程同時處理這些小數據集,最后將這些結果匯總,作為最終的處理結果返回給用戶。

Oracle使用并行踩過的坑

【引自朱wei的博客】一、并行機制的簡述

并行處理的機制實際上就是把一個要掃描的數據集分成很多小數據集,Oracle會根據初始化參數 PARALLEL_MIN_SERVERS=n的值啟動幾個并行服務進程同時處理這些小數據集,***將這些結果匯總,作為最終的處理結果返回給用戶。

二、并行使用場景

1、Parallel query(并行查詢)

執行并行查詢是需要符合以下條件:

A、SQL語句中有Hint提示,比如Parallel或者 Parallel_index。

B、SQL語句中引用的對象被設置了并行屬性。

C、多表關聯中,至少有一個表執行全表掃描(Fulltable scan)或者跨分區的Index range SCAN。

2、Parallel DDL(并行DDL操作,如建表,建索引等)

如:createtable xx parallel 4 as select * from xxx;

create index xxx on tab_xx(column) parallel 4;

3、Parallel DML(并行DML操作,如insert、update、delete等)

如:insert/*+parallel(t 2) */ into t select /*+parallel(t1 2) */ * from t1;

下面從以上三個場景各舉一例來說一下并行易踩的坑。

三、并行對執行計劃的影響

某日,開發突然找過來:喂、DBA嗎?有個測試環境的SQL執行計劃和生產環境不一樣,嚴重影響測試進度。記得當時差不多是這樣的,對方向我扔了一條執行計劃有問題的SQL,然后不說話。作為一個菜鳥,趕緊把生產執行計劃和測試環境對比了一下,發現果真不一樣,折騰了好久,才發現該SQL中的某個表并行度為8,導致了執行計劃異常。記得該表是TB級的大小,是個多表管理的查詢語句,并行度為8之后走了全表掃描(Full table scan),可以想象是又多慢。因為是測試環境,誰做什么操作之后沒有關閉并行就不深究了。下面看一下oracle聯機文檔:http://download.oracle.com/docs/cd/E11882_01/server.112/e10821/ex_plan.htm#PFGRF94687對并行處理的執行計劃的解讀。

  1. SQL>createtable emp2 as select * from scott.emp; 
  2.   
  3. SQL>altertable emp2 parallel 2;  --可以查看dba_tables表degree列 
  4.   
  5. SQL>explainplan for select sum(sal) from emp2 group by deptno; 
  6.   
  7. SQL> select * fromtable(dbms_xplan.display()); 
  8.   
  9. PLAN_TABLE_OUTPUT 
  10. -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
  11. Plan hash value: 3939201228 
  12.   
  13. ------------------------------------------------------------------------------------------------------------------ 
  14. | Id | Operation              |Name     | Rows  | Bytes | Cost (%CPU)| Time     |        TQ  |IN-OUT| PQ Distrib | 
  15. ------------------------------------------------------------------------------------------------------------------ 
  16. |   0| SELECT STATEMENT    |         |         1|          26 |           2   (0)| 00:00:01 |          |         |                  | 
  17. |   1|  PX COORDINATOR           |         |          |           |                 |        |            |         |                 | 
  18. |   2|   PX SEND QC (RANDOM)          | :TQ10001 |  1 |          26 |           2  (0)| 00:00:01 |  Q1,01 | P->S |QC (RAND)  | 
  19. |   3|    HASH GROUP BY |         |         1 |         26 |           2  (0)| 00:00:01 |  Q1,01 | PCWP |                  | 
  20. |   4|     PX RECEIVE                  |         |         1 |         26 |           2  (0)| 00:00:01 |  Q1,01 | PCWP |                  | 
  21. |   5|      PX SEND HASH          | :TQ10000 |  1 |          26 |           2  (0)| 00:00:01 |  Q1,00 | P->P |HASH          | 
  22. |   6|       HASH GROUP BY    |         |         1 |         26 |           2  (0)| 00:00:01 |  Q1,00 | PCWP |                  | 
  23. |   7|        PX BLOCK ITERATOR |             |         1 |         26 |           2  (0)| 00:00:01 |  Q1,00 | PCWC |                  | 
  24. |   8|   TABLE ACCESS FULL| EMP2     |  1 |         26 |           2  (0)| 00:00:01 |  Q1,00 | PCWP |                  | 
  25. ------------------------------------------------------------------------------------------------------------------ 
  26.   
  27. Note 
  28. ----- 
  29.    -dynamic sampling used for this statement (level=2) 
  30.   
  31. 19 rows selected. 

 

當使用了并行執行,SQL的執行計劃中就會多出一列:in-out。該列幫助我們理解數據流的執行方法。它的一些值的含義如下:

Parallel to Serial(P->S): 表示一個并行操作發送數據給一個串行操作,通常是并行incheng將數據發送給并行調度進程。

Parallel to Parallel(P->P):表示一個并行操作向另一個并行操作發送數據,疆場是兩個從屬進程之間的數據交流。

Parallel Combined with parent(PCWP): 同一個從屬進程執行的并行操作,同時父操作也是并行的。

Parallel Combined with Child(PCWC): 同一個從屬進程執行的并行操作,子操作也是并行的。

Serial to Parallel(S->P): 一個串行操作發送數據給并行操作,如果select 部分是串行操作,就會出現這個情況。

如果知道了這些含義,再去解析執行計劃的執行步驟就很容易了。這里強調一下,在處理某些操作之后,對表或者索引等對象開啟了并行的,一定要記得關閉,不然后果很嚴重。

四、并行建主鍵唯一性索引的影響

又是某日,開發欲在測試環境對某一大表建主鍵唯一性索引(前期未規劃好),語句執行了很長時間,因為其它人還需調用該表,但長時間的鎖表,造成了不可用,于是請求DBA幫助,我看了語句之后,給出建議建索引時加上并行并以nologing的方式,然后讓開發自己再去執行,可不久后,開發又找過來說還是很慢,查看沒有任何阻塞之后,決定好好看看是不是真的很慢。經過一番折騰,終于知道慢的原因了,建主鍵約束時不會用到并行。解決方案分兩步走,先建唯一性約束,再加主鍵約束。如下:

1、開并行重建唯一索引:

create unique index schema.xxx onschema.table_name(column1,column2) parallel 16;

2、取消并行:alter indexschema.xxx noparallel; --索引建完后,一定記得取消并行

3、建主鍵約束:alter tableschame.xxx add constraint xxx primary key(column1,column2); --主鍵建立并行是沒有效果的

相關測試這里就不演示了,測試方法很簡單,在建索引的過程中查詢dba_tables表degree列就行了。這里需要強調的一點是對于表的設計規劃,前期一定要做好。

五、并行DML無法生效

  1. SQL> explain plan for insert/*+parallel(a,4) */ into emp2 a select * from emp; 
  2.   
  3. Explained. 
  4.   
  5. SQL> select * fromtable(dbms_xplan.display()); 
  6.   
  7. PLAN_TABLE_OUTPUT 
  8. ----------------------------------------------------------------------------------------- 
  9. Plan hash value: 3956160932 
  10.   
  11. --------------------------------------------------------------------------------- 
  12. | Id | Operation              | Name |Rows      | Bytes | Cost (%CPU)| Time  | 
  13. --------------------------------------------------------------------------------- 
  14. |   0| INSERT STATEMENT    |     |    1 |    87 |     2  (0)| 00:00:01 | 
  15. |   1|  LOAD TABLE CONVENTIONAL | EMP2 ||       |           |              | 
  16. |   2|   TABLE ACCESS FULL        | EMP     |     1 |   87 |     2   (0)| 00:00:01 | 
  17. --------------------------------------------------------------------------------- 
  18.   
  19. Note 
  20. ----- 
  21.    -dynamic sampling used for this statement (level=2) 
  22.   
  23. 13 rows selected. 

 

可以看到該DML語句在有HINT提示的情況下沒有使用并行,那要怎樣才能使它使用并行呢?很簡單,只需要執行alter session enable parallel dml; 這里也可以想一下和之前的并行查詢和并行DDL是不同的。

  1. SQL> alter session enable parallel dml; 
  2.   
  3. Session altered. 
  4.   
  5. SQL> explain plan for insert/*+parallel(a,4) */ into emp2 a select * from emp; 
  6.   
  7. Explained. 
  8.   
  9. SQL> select * fromtable(dbms_xplan.display()); 
  10.   
  11. PLAN_TABLE_OUTPUT 
  12. -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
  13. Plan hash value: 883381916 
  14.   
  15. ----------------------------------------------------------------------------------------------------------------- 
  16. | Id | Operation             | Name       |Rows  | Bytes | Cost (%CPU)| Time        |          TQ |IN-OUT| PQ Distrib | 
  17. ----------------------------------------------------------------------------------------------------------------- 
  18. |   0| INSERT STATEMENT   |         |           1 |  87 |  2   (0)| 00:00:01 |          |          |                   | 
  19. |   1|  PX COORDINATOR          |          |             |             |                   |         |              |          |                   | 
  20. |   2|   PX SEND QC (RANDOM)         | :TQ10001 |     1 |  87 |   2  (0)| 00:00:01 |  Q1,01 | P->S |QC (RAND)| 
  21. |   3|    LOAD AS SELECT| EMP2        |             |             |                   |         |  Q1,01 | PCWP |             | 
  22. |   4|     PX RECEIVE                 |          |          1 |  87 |  2   (0)| 00:00:01 |  Q1,01 | PCWP |          | 
  23. |   5|      PX SEND ROUND-ROBIN| :TQ10000 |     1 |  87|   2  (0)| 00:00:01 |           | S->P | RND-ROBIN         | 
  24. |   6|       TABLE ACCESS FULL | EMP       |           1 |  87|   2  (0)| 00:00:01 |           |          |                   | 
  25. ----------------------------------------------------------------------------------------------------------------- 
  26.   
  27. Note 
  28. ----- 
  29.    -dynamic sampling used for this statement (level=2) 
  30.   
  31. 17 rows selected. 

 

執行之后很見效,從執行計劃重可以很清楚的看到該DML語句利用了并行度。這里使用的的hint的方式提示語句使用并行,若表本身設置了并行度呢?這種情況也是一樣的,需要香執行alter session enable parallel dml; DML語句才可以使用到并行。

還有一個情況需要注意的是,對于開啟并行度之后的表存在事務未提交的,后續的事務一定會失敗,報如下錯誤:ORA-12838: cannot read/modify an object after modifying it inparallel。

  1. SQL> alter table emp2 parallel 2; 
  2.   
  3. Table altered. 
  4.   
  5. SQL> alter session enable parallel dml; 
  6.   
  7. Session altered. 
  8.   
  9. SQL> insert into emp2 a select * fromemp; 
  10.   
  11. rows created. 
  12.   
  13. SQL> insert into emp2 a select * fromemp; 
  14. insert into emp2 a select * from emp 
  15.            * 
  16. ERROR at line 1: 
  17. ORA-12838: cannot read/modify an objectafter modifying it in parallel 

 

該問題在寫存儲過程的時候一定要注意,事務及時提交,但這里又涉及到一個性能問題了,所以對于表這些對象的并行度盡量不要開啟。

總結:并行確實能帶來性能上的提升,效率的提高等,但是凡事都有兩面性,濫用并行的話會導致程序爭議用,資源過度的消耗,并行是會產生排序的,所以了解清除并行的本質,閑時使用并行,合理規劃。 

責任編輯:龐桂玉 來源: 51CTO博客
相關推薦

2024-04-01 08:05:27

Go開發Java

2024-05-06 00:00:00

緩存高并發數據

2015-03-24 16:29:55

默認線程池java

2018-01-10 13:40:03

數據庫MySQL表設計

2019-10-30 14:44:41

Prometheus開源監控系統

2025-04-29 10:17:42

2023-03-13 13:36:00

Go擴容切片

2018-09-11 09:14:52

面試公司缺點

2020-11-03 13:50:31

Redis緩存數據庫

2022-04-26 21:49:55

Spring事務數據庫

2018-01-10 06:17:24

2024-04-10 08:39:56

BigDecimal浮點數二進制

2019-12-12 14:32:26

SQL語句數據庫

2019-02-19 09:46:58

美圖容器化Kubernetes

2024-10-08 08:14:08

用戶生命周期分析服務

2018-08-01 14:45:16

PHP編程語言

2025-04-14 09:31:03

2025-04-15 02:00:00

API版本項目

2017-10-16 09:56:16

2025-04-09 09:26:28

C 語言柔性數組編程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 俺去俺来也www色官网cms | 亚洲 欧美 日韩 精品 | 欧美国产一区二区三区 | 久久精品国产一区二区电影 | 久久精品视频一区二区三区 | 成年无码av片在线 | 国产成人午夜电影网 | heyzo在线| 免费精品视频一区 | 欧美日在线 | 久久99国产精一区二区三区 | 久久这里有精品 | av男人天堂影院 | 黄色在线播放视频 | 国产精品欧美大片 | 中文字幕精品一区二区三区精品 | 日韩伦理电影免费在线观看 | 久久日本 | 一区二区三区免费 | 在线成人 | 粉嫩粉嫩芽的虎白女18在线视频 | 蜜桃视频在线观看免费视频网站www | 国产精品99久久久精品免费观看 | 成人免费视频在线观看 | 在线观看视频中文字幕 | 天堂在线www | 天堂资源视频 | 日韩欧美国产不卡 | 婷婷丁香激情 | 伊人网综合在线观看 | 91视视频在线观看入口直接观看 | 欧美一区二区在线观看 | 一本一道久久a久久精品综合蜜臀 | 日韩在线综合 | 欧美日韩国产精品一区 | 久久亚洲天堂 | 国产在线精品一区二区三区 | 另类二区 | 欧美日韩成人影院 | 日韩精品一区二 | 99精品网|