1:進程
並行要用到兩類進程,分別叫slave process和query coodinator。
slave process是由若干進程組成,這些進程地位相同,每個都負責一部分工作或一個工作單元。就全表掃描來說,每個slave process負責掃描segment的一部分,這樣的一組進程也叫做一個ps set(parallel server set)。
query coodinator進程通常是發出sql語句的那個進程,這個進程負責把一個任務分解成若干個任務片,並申請ps set,爲每個slave process指定工作片段,並收集每個slave process返回的處理結果並彙總成最終的結果返回給用戶。
兩種進程的角色可以這樣理解,slave process是真正幹活的進程,query coodinator只是指手畫腳,負責協調,偶爾也會幹點活的進程。
在並行架構中,query coodinator會把整個工作按照一定粒度(granules)劃分成若干個單元,每個slave process會分配一個工作單元,slave process完成分配給他的單元后,如果還有剩餘的工作單元,則會繼續分配下一個,直到全部完成。
query coodinator劃分工作單元的粒度有兩種。
a:分區:如果對象是分區的,則工作單元可以以分區爲單位進行劃分。
b:數據塊範圍:每個工作單位是一個segment中的若干個數據塊。
2:相關參數
執行如下語句得到和並行相關的一些參數:
SQL> show parameter parallel
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
fast_start_parallel_rollback string LOW
parallel_adaptive_multi_user boolean TRUE
parallel_automatic_tuning boolean FALSE
parallel_execution_message_size integer 2152
parallel_instance_group string
parallel_max_servers integer 320
parallel_min_percent integer 0
parallel_min_servers integer 0
parallel_server boolean TRUE
parallel_server_instances integer 2
parallel_threads_per_cpu integer 2
recovery_parallelism integer 0
一些重要參數的介紹:
parallel_max_servers
並行是通過slave process進程來完成的。並行進程在數據庫範圍內是共享使用的,所有的並行進程組成一個進程池(PX server pool),每當需要並行操作時,就會從這個池中取出足夠的並行進程。完成操作時,就要把並行進程返回這個池中。parallel_max_servers這個參數就是控制數據庫範圍內並行進程的最大數量。
默認值爲cpu數量×10。如果設置成0,則就相當與在數據庫內禁用並行。
parallel_min_servers
parallel_min_servers參數定義了進程池中至少要保有的並行進程數量,數據庫啓動時這些進程就會啓動,而且不管有沒有並行操作用到也會一直運行。如果最小值達不到使用需求,則會動態增加進程數量,增加的進程數量如果在完成任務後5分鐘內沒有被再次使用,則會被關閉。這個參數的默認值爲0,所以有時候使用時會等待一段時間才能看到使用,所以設置爲非0時可以減少一部分的進程等待時間。
查看ps server使用狀況
SQL> select * from v$px_process_sysstat where statistic like 'Servers%';
STATISTIC VALUE
-------------------------------------------------------------------------------- ----------
Servers In Use 0
Servers Available 3
Servers Started 2162
Servers Shutdown 2159
Servers Highwater 71
Servers Cleaned Up 0
6 rows selected
並行處理是一個性能加速器,但是如果使用不當,也會成爲性能殺手。大量的並行會長時間佔用資源,使得其他用戶的操作根本沒有執行的機會。因此需要對並行進行控制,數據庫有兩個參數與此相關
parallel_adaptive_multi_user
這個參數是自適應調節的開關,默認值爲true,可選值false。設置false時對並行使用的並行進程不加限制。但是設置爲true的話則會啓動一個適應性並行算法,這個算法的結果就是平衡用戶的並行請求和系統處理能力,這樣就會在儘量滿足並行的同時預留足夠的資源以備其他的進程來使用。
parallel_min_percent
並行時如果並行度DOP已經確認,那麼進程在運行期間並行度都不會改變。但是如果系統無法滿足請求的並行度,oracle會悄悄的把並行度降低,甚至到串行處理。而該參數就是來限制oracle的這個悄悄的行爲的。
該參數默認值爲0,最大值爲100,是百分比。
爲0時允許oracle的悄然行動
爲100時就意味的必須滿足並行度纔會操作,否則報錯
中間的數字時就要求並行度比例必須大於等於這個值,否則不能運行
例如
設置parallel_adaptive_multi_user=false
設置parallel_max_servers =30
設置parallel_min_percent=100
設置表a的並行屬性爲100
這個時候執行表a上的查詢,由於100×100%=100>30,所以該語句會報錯ora-12827。
並行的相關降級狀況用以下語句查詢
SQL> select name,value from v$sysstat where name like 'Para%';
NAME VALUE
---------------------------------------------------------------- ----------
Parallel operations not downgraded 490954
Parallel operations downgraded to serial 0
Parallel operations downgraded 75 to 99 pct 0
Parallel operations downgraded 50 to 75 pct 0
Parallel operations downgraded 25 to 50 pct 0
Parallel operations downgraded 1 to 25 pct 0
6 rows selected
db_file_multiblock_read_count
這個參數決定了直接讀取操作時每次讀取的數據塊數量,增加這個值可以更好的利用IO
SQL> show parameter db_file
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_file_multiblock_read_count integer 16
pga_aggregate_target
由於數據塊是被讀取到pga中進行操作,所以oracle建議這個值至少要等於100M×parallel_max_servers
換種說法就是parallel_max_servers值不能大於pga_aggregate_target/100M
SQL> show parameter pga_aggregate_target
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target big integer 3881M
並行操作對數據的讀取一般會跳過buffer cache,直接讀讀取到pga中,除非對象在創建時候明確指定了cache屬性,或者對象的數據量小於cache的2%。所以在並行執行前有個checkpoint動作把髒數據寫到數據文件中,否則就會出現數據不一致的狀況。
查詢語句如下
SQL> select name,value from v$sysstat where name like '%DBWR%';
NAME VALUE
---------------------------------------------------------------- ----------
DBWR parallel query checkpoint buffers written 171721
DBWR checkpoints 37923
就對象大小使用並行,oracle給出建議如下
小於200m時不建議使用並行
200m-5G使用並行度4
超過5G的使用最大值32
就何操作可以使用並行,建議如下
全表掃描,全分區掃描,快速索引掃描(FFS)
對於索引的訪問,索引必須是分區索引,每個分區只能被一個slave process訪問
連接(join),排序(sort),聚集(aggregration),集合操作(set operation)
3:啓用並行說明
並行的使用分爲三種,分別針對對象,語句,會話
對象級別
並行屬性在創建的時候可以指定,針對表和索引
create table yu_test (t1 number ,t2 varchar2(10)) parallel 4;
查看select × from yu_test 的執行計劃,如下:
SELECT STATEMENT, GOAL = ALL_ROWS 耗費=2 基數=1 字節=20
PX COORDINATOR
PX SEND QC (RANDOM) 對象所有者=SYS 對象名稱=:TQ10000 耗費=2 基數=1 字節=20
PX BLOCK ITERATOR 耗費=2 基數=1 字節=20
TABLE ACCESS FULL 對象所有者=SYS 對象名稱=YU_TEST 耗費=2 基數=1 字節=20
從=:TQ10000 可以看出使用了並行
針對索引
create index idvvv on yu_test (t1) parallel 4;
創建完畢後修改並行屬性
alter table yu_test parallel 4;
alter index idvvv parallel 4;
取消並行屬性
alter table yu_test parallel 1;
alter table yu_test noparallel ;
alter index idvvv parallel 1;
alter index idvvv noparallel ;
查看對象並行屬性狀況
select degree from dba_tables where table_name='YU_TEST';
select degree from dba_indexes where index_name='IDVVV';
語句級別
就是通過優化器提示來讓語句能夠使用並行處理。
實例:
select /*+ parallel (yu_test 2)*/ * from yu_test;
對錶實行並行度爲2的並行處理。
select /*+ no_parallel (yu_test )*/ * from yu_test
對錶禁止並行處理
索引的就是no_parallel和no_parallel_index
會話級別
會話範圍開啓關閉並行查詢:
alter session enable parallel query;
alter session disable parallel query;
alter session force parallel query parallel 4;
會話範圍開啓關閉並行dml:
alter session enable parallel dml;
alter session disable parallel dml;
alter session force parallel dml parallel 4;
會話範圍開啓關閉並行ddl:
alter session enable parallel ddl;
alter session disable parallel ddl;
alter session force parallel ddl parallel 4;
查看session當前並行狀況的語句:
SQL> select pdml_status,pddl_status,pq_status from v$session where sid=(select distinct sid from v$mystat);
PDML_STATUS PDDL_STATUS PQ_STATUS
----------- ----------- ---------
FORCED FORCED FORCED