Oracleの10億レベルのテーブルは重複データを効率的に削除し、1つだけを保持します

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

おすすめ

転載: blog.csdn.net/lanxuxml/article/details/105650694