0

テーブルから大きなレコードを削除する最良の方法はどれですか? 毎週、テーブルから約 3,000 万件のレコードを削除する必要があるという要件があります。ここでの問題は、UNDO 保持の問題があることです。役立つように、削除ステートメントをチャンクに分割することを計画しています。

現在のステートメント

DELETE FROM LARGE_TABLE WHERE LARGE_ID ='someValue';

表の詳細:

1. テーブルには約 7000 万のレコードが含まれます。

2.削除は、少なくとも 40 ~ 45% のテーブルに影響します。

3.テーブルは分割されていません。

ステートメントを次のように変更する計画

LOOP 

DELETE FROM LARGE_TABLE WHERE LARGE_ID ='someValue' and ROWNUM <'some row number';
COMMIT;
select count(1) INTO nCountValue from LARGE_TABLE WHERELARGE_ID ='someValue' ;
EXIT WHEN nCountValue = 0;

END LOOP;

主なアイデアは、これによりUNDOの保持が減少するということです。

質問、それはベストプラクティスですか? そうでない場合、ポインタはありますか?助けてください

4

2 に答える 2

2

このシナリオでは、

CREATE TABLE LARGE_TABLE_NEW AS
SELECT * FROM LARGE_TABLE 
WHERE LARGE_ID <> 'someValue';

rename LARGE_TABLE to LARGE_TABLE_old;

Rename LARGE_TABLE_new to LARGE_TABLE;

問題がないことを確認してから;

drop table LARGE_TABLE_OLD;

インデックス、制約を再作成します (削除する前に保存することをお勧めします);

挿入は削除よりも高速であるため、これは高速になります。より速く。

于 2013-04-08T07:27:54.667 に答える
0

データベースが 10G の場合、テーブルを完全にドロップするには、purge を使用します

テーブル LARGE_TABLE_OLD パージを削除します。

10gから削除されたテーブルを置き換えることができるため、完全に削除するにはパージを使用する必要があります。

于 2013-04-09T05:30:23.797 に答える