一.Rebuild 索引 與 並行度 說明
在之前的Blog裡整理了一些列有關索引相關的Blog,如下:
Oracle 索引 詳解
http://blog.csdn.net/tianlesoftware/article/details/5347098
如何加快建index 索引 的時間
http://blog.csdn.net/tianlesoftware/article/details/5664019
Oracle 索引掃描的五種類型
http://blog.csdn.net/tianlesoftware/article/details/5852106
Oracle 索引的維護
http://blog.csdn.net/tianlesoftware/article/details/5680706
Oracle alterindex rebuild 與ORA-08104 說明
http://blog.csdn.net/tianlesoftware/article/details/6538928
在索引create 和rebuild的時候,在CPU 允許的情況下,我們可以使用parallel來加快操作的速度。但是這裡有一個注意的問題,有關索引的並行度,這個對錶同樣要注意。
對於OLTP類型的資料庫,除非只用於做統計、報表類的表或索引,建議不對相關表或索引調置並行度。在資料庫有開啟並行查詢的情況下,在表或索引上存在預設並行度,將導致資料庫優先採用全表或全索引掃描的執行計畫,另外將產生多個並行子進程,對於OLTP類應用將反而降低相關SQL的執行效率。
有關parallel,官網的說明如下:
http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_7002.htm#i2159323
The parallel_clause letsyou parallelize creation of the table and set the default degree of parallelismfor queries and the DML INSERT, UPDATE, DELETE,andMERGE after table creation.
(1) NOPARALLEL: Specify NOPARALLEL forserial execution. This is the default,即並行度為1.
(2)PARALLEL: Specify PARALLEL ifyou want Oracle to select a degree of parallelism equal to the number of CPUsavailable on all participating instances times the value ofthe PARALLEL_THREADS_PER_CPU initialization parameter.
(3)PARALLEL integer: Specificationof integer indicates the degree of parallelism, which is thenumber of parallel threads used in the parallel operation. Each parallel threadmay use one or two parallel execution servers. Normally Oracle calculates the optimumdegree of parallelism, so it is not necessary for you to specify integer.
Oracle在平行處理時,會啟動多少個並行進程來同時執行任務,並行度越高, 並行進程越多,執行速度 會越快,預設是noparallel,如果我們設定並行度為default值,那麼此時的並行度是:
伺服器CPU數*每個CPU啟用的線程數(PARALLEL_THREADS_PER_CPU)
所以一般我們建議使用Noparallel,或者將並行度設定為1,而不是default。
可以通過dba_tables 和 dba_indexes 視圖的degree 欄位來查看相關對象的並行度。
要注意的就是在我們用並行來rebuild索引的時候,rebuild結束後,我們索引的並行度也會改成我們rebuild的並行度,所以在我們rebuild 結束之後還需要對索引的並行度進行一個修改操作。
二.樣本
測試環境: win7 +oracle 11.2.0.1
SQL> select * from v$version where rownum=1;
BANNER
-----------------------------------------------------------------------------
Oracle Database 11g Enterprise EditionRelease 11.2.0.1.0 - 64bit Production
--查看並行參數:
SQL> show parameter parallel_max_servers
NAME TYPE VALUE
----------------------------------------------- ------
parallel_max_servers integer 20
SQL> show parameter PARALLEL_THREADS_PER_CPU
NAME TYPE VALUE
----------------------------------------------- ------
parallel_threads_per_cpu integer 2
--測試表Dave資訊:
SQL> select count(*) from dave;
COUNT(*)
----------
333798
SQL> col segment_name for a15
SQL> l
1*select segment_name,bytes/1024/1024||'M' as "size" from dba_segmentswhere segment_name='DAVE' and owner='SYS'
SQL> /
SEGMENT_NAME size
--------------------------------------------------------
DAVE 38M
--使用預設值建立索引:
SQL> create index idx_dave_id on dave(object_id) ;
Index created.
SQL>
--查看預設值:
SQL> select degree from dba_indexes where index_name='IDX_DAVE_ID';
DEGREE
----------------------------------------
1
--這裡預設為noparallel,即為1.
--使用並行度為4,對索引進行rebuild:
SQL> ater index idx_dave_id rebuildparallel 4;
Index altered.
--在次查看索引的並行度:
SQL> select degree from dba_indexes where index_name='IDX_DAVE_ID';
DEGREE
----------------------------------------
4
注意:
這裡變成了4,也就是說啟用了索引自己的並行,這樣在我們使用索引時會影響執行計畫,也會消耗很多的資源。所以,我們需要對這個並行度進行修改,改成noparallel。
--修改並行度為noparallel:
SQL> alter index idx_dave_id noparallel;
Index altered.
--查看並行度:
SQL> select degree from dba_indexes where index_name='IDX_DAVE_ID';
DEGREE
----------------------------------------
1
這裡又變成了1.
使用並行來處理時,我們可以通過v$px_session 來查看相關的等待事件:
SQL> select a.sql_id,a.event,count(*)from v$session a,v$px_session b where a.sid=b.sid group by a.sql_id,a.event;
關於並行的更多測試參考:
OracleParallel Execution(並存執行)
http://blog.csdn.net/tianlesoftware/article/details/5854583
-------------------------------------------------------------------------------------------------------
著作權,文章允許轉載,但必須以連結方式註明源地址,否則追究法律責任!
Skype: tianlesoftware
QQ: tianlesoftware@gmail.com
Email: tianlesoftware@gmail.com
Blog: http://www.tianlesoftware.com
Weibo: http://weibo.com/tianlesoftware
Twitter: http://twitter.com/tianlesoftware
Facebook: http://www.facebook.com/tianlesoftware
Linkedin: http://cn.linkedin.com/in/tianlesoftware
-------加群需要在備忘說明Oracle資料表空間和資料檔案的關係,否則拒絕申請----
DBA1 群:62697716(滿); DBA2 群:62697977(滿) DBA3 群:62697850(滿)
DBA 超級群:63306533(滿); DBA4 群:83829929 DBA5群: 142216823
DBA6 群:158654907 DBA7 群:172855474 DBA總群:104207940