国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Oracle - Oracle并行操作之并行查詢實例解析

Oracle并行操作之并行查詢實例解析

2019-12-10 15:05shichen2014 Oracle

這篇文章主要介紹了Oracle并行操作的并行查詢技術,需要的朋友可以參考下

Oracle數據庫的并行操作特性,其本質上就是強行榨取除數據庫服務器空閑資源(主要是CPU資源),對一些高負荷大數據量數據進行分治處理。并行操作是一種非確定性的優化策略,在選擇的時候需要小心對待。目前,使用并行操作特性的主要有下面幾個方面:

Parallel Query:并行查詢,使用多個操作系統級別的Server Process來同時完成一個SQL查詢;
Parallel DML:并行DML操作。類似于Parallel Query。當要對大數據量表進行DML操作,如insert、update和delete的時候,可以考慮使用;
Parallel DDL:并行DDL操作。如進行大容量數據表構建、索引rebuild等操作;
Parallel Recovery,并行恢復。當數據庫實例崩潰重新啟動,或者進行存儲介質恢復的時候,可以啟動并行恢復技術。從而達到減少恢復時間的目的;
Procedural Parallel,過程代碼并行化。對我們編寫的代碼片段、存儲過程或者函數,可以實現執行的并行化,從而加快執行效率;
 
1、并行查詢Parallel Query
 
Oracle數據庫的并行查詢是比較基礎的技術,也是OLAP和Oracle Data Warehouse經常使用的一種并行技術。同本系列前面一直強調的要素相同,在確定使用并行技術之前,要確定軟硬件的一些先決條件:
 
任務task必要條件。備選進行并行操作的任務task必須是一個大任務作業,比如,長時間的查詢。任務時間通常可以以分鐘、小時進行計數。只有這樣的任務和需要,才值得讓我們冒險使用并行操作方案;
資源閑置條件。只有在數據庫服務器資源存在閑置的時候,才可以考慮進行并行處理。如果經常性的繁忙,貿然使用并行只能加劇資源的爭用。

并行操作最大的風險在于并行爭用引起的效率不升反降。所以,要在確定兩個前提之后,再進行并行規劃處理。

2、環境準備

首先,準備實驗環境。由于筆者使用的一般家用PC虛擬機,所以并行度和存儲量不能反映真實條件需求,見諒。

?
1
2
3
4
5
6
7
8
SQL> select * from v$version where rownum<2;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
SQL> select count(*) from t;
 COUNT(*)
----------
1160704

 
選擇11gR2服務器環境,數據表T總數據量超過一百萬。
 
首先,我們觀察一下不使用并行的執行情況。
 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//提取出使用游標信息;
SQL> select sql_text, sql_id, version_count from v$sqlarea where sql_text like 'select count(*) from t%';
SQL_TEXT            SQL_ID    VERSION_COUNT
------------------------------ ------------- -------------
select count(*) from t     2jkn7rpsbj64t       2
SQL> select * from table(dbms_xplan.display_cursor('2jkn7rpsbj64t',format => 'advanced', cursor_child_no => 0));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID 2jkn7rpsbj64t, child number 0
-------------------------------------
select count(*) from t
Plan hash value: 2966233522
-------------------------------------------------------------------
| Id | Operation     | Name | Rows | Cost (%CPU)| Time   |
-------------------------------------------------------------------
|  0 | SELECT STATEMENT  |   |    | 4464 (100)|     |
|  1 | SORT AGGREGATE  |   |   1 |      |     |
|  2 |  TABLE ACCESS FULL| T  | 1160K| 4464  (1)| 00:00:54 |
-------------------------------------------------------------------


該執行計劃中沒有使用并行特性,進行全表掃描。執行時間為54s。
 
3、并行查詢計劃
 
首先,我們設置相應的并行度。設置并行度有兩種方式,一種是使用hint加在特定的SQL語句上。另一種是對大對象設置并行度屬性。
 
前者的優點是帶有一定的強制性和針對性。就是指定特定的SQL語句進行并行處理。這樣的優點是易于控制并行度,缺點是帶有很強的強制力,當數據量偏小的時候,使用并行優勢不大。而且如果是顯示指定并行度,又會帶來移植伸縮性差的缺點。
 
后者通過對象的屬性指定并行度。就將并行作為一種執行手段,提供給優化器進行選擇。這樣,CBO會根據系統中資源的情況和數據的實際,進行執行計劃生成。計劃中可能是并行,也可能不是并行。這樣的優點是將并行與否交予優化器CBO去判斷,缺點是并行的濫用風險。
 
此處,筆者設置自動確定并行度的方式。
 

?
1
2
3
4
5
6
SQL> alter table t parallel;
Table altered
SQL> select count(*) from t;
 COUNT(*)
----------
1160704

當啟動查詢時,Oracle中的并行伺候進程池會根據系統中的負荷和實際因素,確定分配出的并行進程數量。此時,我們可以通過視圖v$px_process來查看進程池中的連接信息。 

?
1
2
3
4
5
SQL> select * from v$px_process;
SERVER_NAME STATUS      PID SPID       SID  SERIAL#
----------- --------- ---------- ------------------------ ---------- ----------
P000    AVAILABLE     25 5776               
P001    AVAILABLE     26 5778

注意,并行伺候進程是一種特殊的Server Process,本質上是一種可共享的slave進程。專用連接模式下,一般的Server Process與Client Process是“同生共死”的關系,終身服務于一個Client Process。而伺候slave進程是通過進程池進行管理的,一旦啟動初始化,就會在一定時間內駐留在系統中,等待下次并行處理到來。
 
此時,我們檢查v$process視圖,也可以找到對應的信息。

?
1
2
3
4
5
6
7
SQL> select * from v$process;
PID SPID     PNAME USERNAME      SERIAL# PROGRAM   
-------- ---------- ------------------------ ----- --------------- ---------- -------------------------------
25 5776      P000 oracle         13 oracle@oracle11g (P000)  
26 5778      P001 oracle          6 oracle@oracle11g (P001)  
(篇幅由于原因,予以省略……)
32 rows selected

對應的OS中,也存在相應的真實進程伺候。
 

?
1
2
3
4
5
6
7
8
9
[oracle@oracle11g ~]$ ps -ef | grep oracle
(篇幅由于原因,予以省略……)
oracle  5700   1 0 17:29 ?    00:00:02 oraclewilson (LOCAL=NO)
oracle  5723   1 0 17:33 ?    00:00:00 ora_smco_wilson
oracle  5764   1 2 17:40 ?    00:00:05 oraclewilson (LOCAL=NO)
oracle  5774   1 0 17:42 ?    00:00:00 oraclewilson (LOCAL=NO)
oracle  5776   1 0 17:43 ?    00:00:00 ora_p000_wilson
oracle  5778   1 0 17:43 ?    00:00:00 ora_p001_wilson
oracle  5820   1 1 17:44 ?    00:00:00 ora_w000_wilson

由于此時查詢已經結束,對應的并行會話信息,已經消失不可見。
 

?
1
2
3
SQL> select * from v$px_session;
SADDR      SID  SERIAL#   QCSID QCSERIAL#
-------- ---------- ---------- ---------- ----------

但是,如果任務的時間長,是可以捕獲到對應信息的。
 
從上面的情況看,我們執行一個并行操作時,Oracle會從伺候進程池中獲取到對應的并行進程,來進行操作。當操作完成后,伺候進程還會等待一定時間,之后回收。
 
并行操作進程的資源消耗,通過v$px_sysstat視圖查看。
 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SQL> col statistic for a30;
SQL> select * from v$px_process_sysstat;
STATISTIC              VALUE
------------------------------ ----------
Servers In Use             0
Servers Available            0
Servers Started             2
Servers Shutdown            2
Servers Highwater            2
Servers Cleaned Up           0
Server Sessions             6
Memory Chunks Allocated         4
Memory Chunks Freed           0
Memory Chunks Current          4
Memory Chunks HWM            4
Buffers Allocated           30
Buffers Freed             30
Buffers Current             0
Buffers HWM               8
15 rows selected

 
下面,我們檢查一下執行計劃信息。
 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SQL> set pagesize 10000;
SQL> select * from table(dbms_xplan.display_cursor('2jkn7rpsbj64t',format => 'advanced',cursor_child
_no => 1));
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
SQL_ID 2jkn7rpsbj64t, child number 1
-------------------------------------
select count(*) from t
Plan hash value: 3126468333
----------------------------------------------------------------------------------------------------
| Id | Operation       | Name   | Rows | Cost (%CPU)| Time   |  TQ |IN-OUT| PQ Distrib
----------------------------------------------------------------------------------------------------
|  0 | SELECT STATEMENT    |     |    | 2478 (100)|     |    |   |     
|  1 | SORT AGGREGATE    |     |   1 |      |     |    |   |     
|  2 |  PX COORDINATOR    |     |    |      |     |    |   |     
|  3 |  PX SEND QC (RANDOM) | :TQ10000 |   1 |      |     | Q1,00 | P->S | QC (RAND)
|  4 |   SORT AGGREGATE   |     |   1 |      |     | Q1,00 | PCWP |     
|  5 |   PX BLOCK ITERATOR |     | 1160K| 2478  (1)| 00:00:30 | Q1,00 | PCWC |     
|* 6 |    TABLE ACCESS FULL| T    | 1160K| 2478  (1)| 00:00:30 | Q1,00 | PCWP |     
----------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
6 - access(:Z>=:Z AND :Z<=:Z)

從執行計劃的條件(6 - access(:Z>=:Z AND :Z<=:Z))中,我們可以看到任務分配,之后分別進行全表掃描。最后排序計算count,合并結果的過程。
 
4、結論
 
Oracle Parallel Query是經常使用到的一種并行操作技術。相對于DDL、DML等類型操作,并行查詢更可以作為系統功能的一個步驟來進行。
 
進行并行查詢最大的風險就是并行濫用和失控的出現。這也是Oracle一直致力解決的問題。在Oracle11gR2中,引入了Parallel Statement Queuing(PSQ)技術特性。通常,只要并行伺候池允許,Oracle會引入盡可能多的并行進程進行操作。PSQ技術的出現,就是從資源角度加入了并行控制。
 
當系統繁忙的時候,PSQ會將一些要進行的并行操作進入等待狀態,防止并行環境的惡化。當環境好轉之后,等待隊列中的并行語句就進入執行狀態。這個特性就可以有效的防止并行濫用的出現。

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 国产成人黄色av | 欧美国产精品一区 | 国产精品久久久久永久免费观看 | 国产成人精品一区二区三区四区 | 日本一区二区三区四区 | 久久国产精品免费一区二区三区 | 午夜成人免费电影 | 国产精品久久久久久av公交车 | 国产黄大片| 久久久青草婷婷精品综合日韩 | 日韩一区二区不卡 | 国产视频1区 | 国产精品美女久久久久久久久久久 | 国产最新视频 | 日韩视频免费 | 青青国产在线 | 精品一区在线 | 成人av在线网站 | 日本伊人网 | av在线电影网 | www.中文字幕.com | 国产一区二区三区午夜 | 久久精品美女 | 日本中文一区二区 | 国产欧美一区二区 | www.久久 | 亚洲午夜视频 | 久久国产精品免费一区二区三区 | 国产精品久久久91 | 欧美精品 在线观看 | 成人自拍视频 | 亚洲国产一区二区三区在线播放 | 欧美日韩美女 | h在线免费 | 狠狠爱综合 | 一级免费片 | 亚洲久草| 午夜夜| 在线视频中文字幕 | 久久国产欧美日韩精品 | 一区二区三区久久 |