如何在不生成重做日志的情况下删除记录
How to delete records without generating redo log
我有一个 table 如下所示:
Create Table Txn_History nologging (
ID number,
Comment varchar2(300),
... (Another 20 columns),
Std_hash raw(1000)
);
这个 table 是 8GB,有 1900 万行,每天增长大约 50,000 行。
我需要删除 300,000 行并更新 100,000 行。我知道正常的delete和update语句会导致Oracle数据库产生redo log。我知道避免这种情况的唯一方法是使用更新后的结果创建一个新的 table。
但是,考虑到删除和更新语句只占整个table的2%,创建一个新的table似乎不太值得,其次是所有相应的索引。
你有什么新想法吗?
老实说,我不认为重做生成在这里是个大问题:只需删除 30 万行和更新 10 万行...对于此类批处理操作,Oracle 使用快速“数组更新”重做操作。可能您需要跟踪您的操作以找出真正的瓶颈和负载配置文件(IO/CPU、访问路径、触发器、索引等)。
基本上,最好正确使用分区选项 update/delete(或截断)整个分区。
还有从 Oracle 12.2 开始的新 alter table ... move including rows where ...
功能:
https://blogs.oracle.com/sql/how-to-delete-millions-of-rows-fast-with-sql
我有一个 table 如下所示:
Create Table Txn_History nologging (
ID number,
Comment varchar2(300),
... (Another 20 columns),
Std_hash raw(1000)
);
这个 table 是 8GB,有 1900 万行,每天增长大约 50,000 行。
我需要删除 300,000 行并更新 100,000 行。我知道正常的delete和update语句会导致Oracle数据库产生redo log。我知道避免这种情况的唯一方法是使用更新后的结果创建一个新的 table。
但是,考虑到删除和更新语句只占整个table的2%,创建一个新的table似乎不太值得,其次是所有相应的索引。
你有什么新想法吗?
老实说,我不认为重做生成在这里是个大问题:只需删除 30 万行和更新 10 万行...对于此类批处理操作,Oracle 使用快速“数组更新”重做操作。可能您需要跟踪您的操作以找出真正的瓶颈和负载配置文件(IO/CPU、访问路径、触发器、索引等)。
基本上,最好正确使用分区选项 update/delete(或截断)整个分区。
还有从 Oracle 12.2 开始的新 alter table ... move including rows where ...
功能:
https://blogs.oracle.com/sql/how-to-delete-millions-of-rows-fast-with-sql