小白要在千萬級資料的表上建索引,8個索引,創建了一個晚上都木有成功,這要是生產上線日豈不是要掛,要掛呀?心急如焚搜搜搜.....找到一個好資料....
一. 先來看一下創建索引要做哪些操作:
1. 把index key的data 讀到記憶體
==>如果data 沒在db_cache 中,這時候很容易有大量的db file scatter read wait
2. 對index key的data 作排序
==>sort_area_size 或者pga_aggregate_target 不夠大的情況下,需要做disk sort, 會有大量的driect path read/write , 另外,消耗大量CPU Time
3. 創建新的index segment , 把排過序的index data 寫到所創建的index segment 里面
==>如果index 很大,那么,有時也會有redo log 相關等待,如:
log buffer space ,log file sync , log file parallel write 等
所以,在建大表索引時,可以增大pga,增大temp tablepace,并且用nologging或并行選項。
如:
create index idx_logs on logs(time) nologging parallel 4;
并行度一般看CPU 個數。當然在CPU 比較空閑的情況下可以多并行幾個。對于單CPU 不建議用并行,這樣反而會增加創建時間。也可以根據v$session_wait 的資料,做針對性的tuning , 這樣可以降低點時間。
補充知識:
查看cpu 資訊:more /proc/cpuinfo
查看記憶體資訊:more /proc/meminfo
查看作業系統資訊:more /etc/issue
有關索引概念性的東西,請參考我的Blog:
Oracle 索引 詳解:/database/201110/107271.html
----------------------------------------------------------------------------------
--場景一:
SQL> CREATE index IX_RC_MATCH ON CONTROL_MATCH(ITS_ORDER_NO, TEL) initrans 16 online;
Index created
Executed in 306.588 seconds
---場景二:
SQL> SET TIMING ON;
SQL> CREATE index IX_RC_MATCH ON CONTROL_MATCH(ITS_ORDER_NO, TEL) initrans 16 NOLOGGING PARALLEL 4 online;
Index created
Executed in 137.983 seconds
---場景三:
SQL> set timing on;
SQL> CREATE index IX_RC_MATCH ON CONTROL_MATCH(ITS_ORDER_NO, TEL) initrans 16 NOLOGGING online;
Index created
Executed in 302.689 seconds
--場景四:
SQL> CREATE index IX_RC_MATCH ON CONTROL_MATCH(ITS_ORDER_NO, TEL) initrans 16 NOLOGGING PARALLEL 6 online;
Index created
Executed in 87.142 seconds
--場景五:
SQL> set timing on;
SQL> CREATE index IX_RC_MATCH ON CONTROL_MATCH(ITS_ORDER_NO, TEL) initrans 16 NOLOGGING PARALLEL 8 online;
Index created
Executed in 102.274 seconds
--場景六:
SQL> CREATE index IX_RC_MATCH ON CONTROL_MATCH(ITS_ORDER_NO, TEL) initrans 16 NOLOGGING PARALLEL 5 online;
Index created
Executed in 167.981 seconds
---場景七:
SQL> set timing on;
SQL> CREATE index IX_RC_MATCH ON CONTROL_MATCH(ITS_ORDER_NO, TEL) initrans 16 NOLOGGING PARALLEL 7 online;
Index created
Executed in 100.668 seconds
--場景八:
SQL> set timing on;
SQL> CREATE index IX_RC_MATCH ON CONTROL_MATCH(ITS_ORDER_NO, TEL) initrans 16 PARALLEL 7 online;
Index created
Executed in 197.809 seconds
uj5u.com熱心網友回復:
可以將表中資料轉移到臨時表,然后在空表上建立索引,完成之后再將資料重新insert到索引表中uj5u.com熱心網友回復:
業務少的時候,盡可能的并行;uj5u.com熱心網友回復:
這要是生產上線日豈不是要掛,意思就是說,還不是生產系統唄。可以暫停,如2樓所說,把資料搬走,建好索引再搬回來uj5u.com熱心網友回復:
給你一個大表創建通用參考:
1.業務不忙的時候,反正后臺跑,一般做成定時任務
2.臨時表空間足夠大(8個索引可能占多大空間,就給多大,自行估算一下)
#8 15 * * * /jyc/addindex.sh
[root@db]/jyc#more /jyc/addindex.sh
#!/bin/sh
su - oracle -c "sqlplus /nolog <<EOF
set time on
set timing on
conn xxx/xxx
alter session set workarea_size_policy=manual;
alter session set sort_area_size=1073741820;
alter session set sort_area_retained_size=1073741820;
alter session set db_file_multiblock_read_count=128;
create index IDX_XXX on XXX(欄位) online NOLOGGING parallel 8 compute statistics;
alter index IDX_XXX noparallel;
alter index IDX_XXX LOGGING;
exit;
EOF" >> /jyc/IDX_XXX.out
另外查看索引創建的進度:
col opname format a32
col target_desc format a32
col perwork format a12
set lines 131
select sid,OPNAME,TARGET_DESC,sofar,TOTALWORK,trunc(sofar/totalwork*100,2)||'%' as perwork
from v$session_longops where sofar!=totalwork;
uj5u.com熱心網友回復:
是個好辦法,只是我們java開發和資料庫dba是兩個組織,上線時間限定在1個小時,40個系統同時上線,系統關聯性大,dba應該頭都不用搖就把我們給拒絕了...uj5u.com熱心網友回復:
1、先插入資料,在建立索引2、業務空閑時,調整PGA的大小
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/116394.html
標籤:開發
上一篇:PL/SQL 同一個回圈中,同一個select into ...from...,select出去的值是空的
下一篇:200萬資料查詢問題
