删除表中的记录在oracle中包含1.8亿

时间:2014-05-15 06:25:59

标签: sql oracle stored-procedures oracle-sqldeveloper sql-tuning

我有订单表,每张表中至少有1亿条记录。我们有一个正在运行的作业,它调用一个存储过程,每天删除至少50K(MIN)和200K(MAX)记录。

我目前正在使用SQL BULK COLLECT从表中删除记录。目前删除50K已经花了4个多小时,这已经慢了。

在google中搜索后,想出了CTAS方法,i,e创建表并保留我们想要的记录并删除现有记录并重命名临时表。我不能这样做因为这个选项没有被接受,因为表格更加重要。

您能否提出一些改善其性能的解决方案?

提前致谢!!

2 个答案:

答案 0 :(得分:1)

假设您有足够的物理磁盘空间来复制数据,您可以使用以下方法(我假设您的表名为ORDERS):

  • 使用CREATE TABLE orders_b AS SELECT * FROM orders
  • 创建订单表的副本ORDER_B
  • 将您的原始表重命名为ORDERS_A:ALTER TABLE orders RENAME TO orders_a
  • 创建一个名为ORDERS的同义词,指向ORDERS_A:CREATE SYNONYM orders FOR order_a

到目前为止,这么好。您的客户端代码现在使用同义词ORDERS而不是物理表。 现在是有趣的部分(每日刷新例程):

  • 截断ORDERS_B
  • 使用INSERT /*+APPEND+*/填写ORDERS_B(您可能还想尝试PARALLEL提示)
  • 将同义词ORDERS切换为指向ORDERS_B
  • 第二天:使用ORDERS_A而不是ORDERS_B
  • 重复
  • 无限重复广告

或者,您可以删除表并重新创建它,而不是使用TRUNCATE / INSERT。这需要更多的工作,因为您还必须重新创建索引和授权。

此技术称为同义词切换 - 您可能需要阅读Tyler Muth's article about synonym switching以获得更完整的解释。

答案 1 :(得分:0)

删除记录的条件是什么?

也许您可以在此表上创建基于函数的索引。然后,您可以使用单个简单的删除语句删除记录。或者考虑表分区。如果您的分区键是智能的并且涵盖了删除条件,则可以在几秒钟内删除或清除旧分区。

顺便说一下,使用包DBMS_REDEFINITION,您可以更改"正常"即使没有中断服务,也可以将表格划分为分区表格。