友
我有订单表,每张表中至少有1亿条记录。我们有一个正在运行的作业,它调用一个存储过程,每天删除至少50K(MIN)和200K(MAX)记录。
我目前正在使用SQL BULK COLLECT从表中删除记录。目前删除50K已经花了4个多小时,这已经慢了。
在google中搜索后,想出了CTAS方法,i,e创建表并保留我们想要的记录并删除现有记录并重命名临时表。我不能这样做因为这个选项没有被接受,因为表格更加重要。
您能否提出一些改善其性能的解决方案?
提前致谢!!
答案 0 :(得分:1)
假设您有足够的物理磁盘空间来复制数据,您可以使用以下方法(我假设您的表名为ORDERS):
CREATE TABLE orders_b AS SELECT * FROM orders
ALTER TABLE orders RENAME TO orders_a
CREATE SYNONYM orders FOR order_a
到目前为止,这么好。您的客户端代码现在使用同义词ORDERS而不是物理表。 现在是有趣的部分(每日刷新例程):
INSERT /*+APPEND+*/
填写ORDERS_B(您可能还想尝试PARALLEL提示)或者,您可以删除表并重新创建它,而不是使用TRUNCATE / INSERT。这需要更多的工作,因为您还必须重新创建索引和授权。
此技术称为同义词切换 - 您可能需要阅读Tyler Muth's article about synonym switching以获得更完整的解释。
答案 1 :(得分:0)
删除记录的条件是什么?
也许您可以在此表上创建基于函数的索引。然后,您可以使用单个简单的删除语句删除记录。或者考虑表分区。如果您的分区键是智能的并且涵盖了删除条件,则可以在几秒钟内删除或清除旧分区。
顺便说一下,使用包DBMS_REDEFINITION
,您可以更改"正常"即使没有中断服务,也可以将表格划分为分区表格。