1つ、サーバー情報
1.メモリ
[oracle@xmldb ~]$ free -g
total used free shared buffers cached
Mem: 125 92 33 0 0 59
-/+ buffers/cache: 32 93
Swap: 80 0 80
2.CPU
[oracle@xmldb ~]$ cat /proc/cpuinfo| grep "cpu cores"| uniq
cpu cores : 8
[oracle@yundingora ~]$ cat /proc/cpuinfo| grep "processor"| wc -l
32
3.IO
サーバーIO
[oracle@xmldb ~]$ dd if=/home/oracle/linuxx64_12201_database.zip of=/home/oracle/linuxx64_12201_database.zip.dd
6745501+1 records in
6745501+1 records out
3453696911 bytes (3.5 GB) copied, 25.2508 s, 137 MB/s
データベースIO
数据存在另外一个磁阵上,后续再补
2、データベース情報
1.データベースのメモリ情報
SQL> show parameter ga;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
allow_group_access_to_sga boolean FALSE
lock_sga boolean FALSE
pga_aggregate_target big integer 0
sga_max_size big integer 1088M
sga_target big integer 0
unified_audit_sga_queue_size integer 1048576
3、テーブル情報
1.データシート情報
select a.table_name,a.partitioned,a.degree,b.num_cols,a.num_rows,round(a.blocks*8/1024,2) as size_m,a.logging,a.last_analyzed
from all_tables a,(select table_name, count(*) as num_cols from user_tab_columns group by table_name) b
where a.table_name='TB_DELETE_TEST'
and a.table_name=b.table_name;
TABLE_NAME PAR DEGREE NUM_COLS NUM_ROWS SIZE_M LOG LAST_ANAL
-------------- ----- ---------- ---------- ----------- -------- ----- -----
TB_DELETE_TEST NO 1 11 107946703 11011.56 YES 21-APR-20
Elapsed: 00:00:00.79
--该表无索引。
2.1少数の繰り返しレコード
FI_QRY@orcl>select count(*) as distinct_2_cols_cnts from (select /*+parallel(30)*/ distinct acc,med_no,med_op_date from TB_DELETE_TEST);
DISTINCT_2_COLS_CNTS
--------------------
107946694
Elapsed: 00:00:29.56
select 107946703-107946694 as repeat_cnts from dual;
REPEAT_CNTS
-----------
9
Elapsed: 00:00:00.00
2.2大量の重複レコードがある場合
FI_QRY@orcl>select count(*) as distinct_2_cols_cnts from (select /*+parallel(30)*/ distinct ACC,PAPER_NO from TB_DELETE_TEST);
DISTINCT_2_COLS_CNTS
--------------------
94681760
Elapsed: 00:00:30.88
--重复记录条数
FI_QRY@orcl>select 107946703-94681760 as repeat_cnts from dual;
REPEAT_CNTS
-----------
13264943
Elapsed: 00:00:00.00
4つの効率的な重複排除
3.1少量の繰り返しレコードがある場合、DMLステートメントを使用して完了することができます
(どこでもヒントに注意を払う)
FI_QRY@orcl>delete /*+RULE parallel(8)*/ from TB_DELETE_TEST a
where exists (select /*+parallel(8)*/
from ( select /*+parallel(30)*/ rowid rid,row_number() over (partition by acc,med_no,med_op_date order by rowid) rn from TB_DELETE_TEST) b
where b.rn <> 1 and a.rowid=b.rid);
9 rows deleted.
Elapsed: 00:03:28.89
3.2多数の繰り返しレコードがある場合、DDLステートメントを完了することをお勧めします
(どこでもヒントに注意を払う)
FI_QRY@orcl>create /*+parallel(30)*/ table TB_DELETE_TEST_NEW as select /*+parallel(30)*/ DISTINCT * from TB_DELETE_TEST;
Table created.
Elapsed: 00:01:26.46
FI_QRY@orcl>rename TB_DELETE_TEST to TB_DELETE_TEST_OLD;
Table renamed.
Elapsed: 00:00:00.99
FI_QRY@orcl>rename TB_DELETE_TEST_NEW to TB_DELETE_TEST;
Table renamed.
Elapsed: 00:00:00.02
FI_QRY@orcl>drop table TB_DELETE_TEST_OLD purge;
Table dropped.
Elapsed: 00:00:00.56
FI_QRY@orcl>
高速削除を使用すると、時間がかかります
FI_QRY@orcl>delete /*+RULE parallel(8)*/ from TB_DELETE_TEST1 a
where exists (select /*+parallel(8)*/
from ( select /*+parallel(30)*/ rowid rid,row_number() over (partition by acc,paper_no order by rowid) rn from TB_DELETE_TEST1) b
where b.rn <> 1 and a.rowid=b.rid);
13264943 rows deleted.
Elapsed: 03:01:20.54
その他:たとえば、テーブルを使用してパーティションを設定し、プログラムを使用してパーティションごとに順番に削除します。
要約すると、重複データの量が少ない場合は、上記の削除方法を使用して1つをすばやく削除して保持できます。重複データの量が多い場合は、DDLの使用をお勧めします。
さらに、表のデータ量が数千万を下回り、繰り返されるデータが数百万の場合でも、上記の削除により、重複排除は数分以内に完了できます。詳細については、以下を参照してください。
https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:15258974323143