11.2.0.2的RAC系统中原本有一张大的分区表,之前为了测试exchange分区的性能需要将这张分区表上的部分分区数据复制到测试用表上,因为数据量比较大所以记以录之:
磁盘不太给力
hdparm -tT /dev/sdd
/dev/sdd:
Timing cached reads: 13672 MB in 2.00 seconds = 6840.55 MB/sec
Timing buffered disk reads: 605 MB in 3.02 seconds = 200.33 MB/sec
cat /proc/cpuinfo |grep processor|wc -l
8
直接将源分区插入到目标分区表中
SQL> select count(*) from sales_history partition (SALES_1996) ;
COUNT(*)
----------
2568089600
SQL> select (bytes) / 1024 / 1024, segment_name, partition_name
2 from dba_segments
3 where segment_name = 'SALES_HISTORY'
4 order by bytes desc
5 /
(BYTES)/1024/1024 SEGMENT_NAME PARTITION_NAME
----------------- -------------------- ------------------------------
288710 SALES_HISTORY SALES_1996
232 SALES_HISTORY SALES_H2_1997
232 SALES_HISTORY SALES_H1_1997
SQL> set timing on;
SQL> alter session enable parallel dml;
Session altered.
SQL> insert /*+ append parallel(ss,4) */
2 into sales ss
3 select /*+ parallel(sh,4) */ * from sales_history partition(SALES_1996) sh ;
Elapsed: 01:01:08.03 -- 耗时61分钟
SQL> commit;
Commit complete.
Elapsed: 00:00:00.19
Workarea Size
SQL> SELECT
2 sql_id,
3 operation_type,
4 policy,
5 active_time,
6 work_area_size,
7 expected_size,
8 actual_mem_used,
9 max_mem_used,
10 number_passes,
11 tempseg_size
12 FROM (SELECT swa.workarea_address,
13 swa.sql_id,
14 sa.sql_text,
15 swa.operation_type,
16 swa.policy,
17 swa.sid,
18 swa.active_time / 1000 active_time,
19 swa.work_area_size,
20 swa.expected_size,
swa.actual_mem_used,
swa.max_mem_used,
swa.number_passes,
swa.tempseg_size,
swa.tablespace,
(CASE
WHEN sl.totalwork <> 0 THEN
sl.sofar / sl.totalwork
21 22 23 24 25 26 27 28 29 ELSE
30 NULL
31 END) complete_ratio,
32 sl.elapsed_seconds * 1000 elapsed,
33 sl.time_remaining * 1000 time_remaining,
34 sl.opname,
35 s.machine,
s.program,
36 37 s.module,
38 s.osuser,
39 NVL(DECODE(TYPE,
40 'BACKGROUND',
41 'SYS (' || b.ksbdpnam || ')',
42 s.username),
43 SUBSTR(p.program, INSTR(p.program, '('))) username,
44 ROW_NUMBER() OVER(PARTITION BY swa.sql_id ORDER BY sl.last_update_time DESC) rnum
45 FROM v$sql_workarea_active swa,
46 v$sqlarea sa,
47 (SELECT * FROM v$session_longops WHERE sofar <> totalwork) sl,
48 v$session s,
49 v$process p,
50 x$ksbdp b
51 WHERE sl.sid(+) = swa.sid
52 AND sl.sql_id(+) = swa.sql_id
53 AND swa.sid <> USERENV('sid')
54 AND sa.sql_id = swa.sql_id
55 AND s.sid = swa.sid
56 AND s.paddr = p.addr
57 AND b.inst_id(+) = USERENV('INSTANCE')
58 AND p.addr = b.ksbdppro(+)
59 ORDER BY swa.number_passes DESC, swa.work_area_size DESC)
60 WHERE rnum = 1
61 /
SQL_ID OPERATION_TYPE POLICY ACTIVE_TIME WORK_AREA_SIZE EXPECTED_SIZE ACTUAL_MEM_USED MAX_MEM_USED NUMBER_PASSES TEMPSEG_SIZE
------------- ------------------------------ ------ ----------- -------------- ------------- --------------- ------------ ------------- ------------
ak9ht406k4zn4 LOAD WRITE BUFFERS AUTO 889394.542 541696 1048576 541696 541696 0
SQL> alter session set workarea_size_policy=MANUAL;
Session altered.
Elapsed: 00:00:00.04
SQL> alter session set sort_area_size=314572800;
Session altered.
Elapsed: 00:00:00.00
SQL> alter session set sort_area_size=314572800;
Session altered.
创建索引
create index ind_sales on sales(prod_id,cust_id,time_id,channel_id) nologging parallel 8
/
Index created.
Elapsed: 01:04:12.68
SQL>@sort_activity
SQL_ID OPERATION_TYPE POLICY ACTIVE_TIME/1000 WORK_AREA_SIZE EXPECTED_SIZE ACTUAL_MEM_USED MAX_MEM_USED NUMBER_PASSES TEMPSEG_SIZE_IN_GB
------------- ------------------------------ ------ ---------------- -------------- ------------- --------------- ------------ ------------- ------------------
490ntjgc2dass SORT (v2) MANUAL 1275.18291 0 287324160 310392832 1 6.94238281
SQL> set linesize 200 pagesize 1400
SQL> col opname for a20
SQL> select opname,totalwork,units,elapsed_seconds,sql_plan_options from v$session_longops where opname='Sort Output';
OPNAME TOTALWORK UNITS ELAPSED_SECONDS SQL_PLAN_OPTIONS
-------------------- ---------- -------------------------------- --------------- ------------------------------
Sort Output 1528129 Blocks 1809 CREATE INDEX
Sort Output 1529098 Blocks 1701 CREATE INDEX