【问题标题】:Deletion from huge table which does not have index created on it从没有创建索引的大表中删除
【发布时间】:2022-06-11 01:45:54
【问题描述】:

我有一个包含 2.3 亿条记录的表,我需要根据某些条件每天从该表中删除 300 条记录。现在,该表没有在其上创建索引。要删除 300 条记录,我创建了一个执行删除部分的作业。客户端不能在这个特定的表上创建索引(或分区索引)。

截至目前,我正在使用 CURSOR FOR 方法从该表中删除记录,但它运行 3 小时以删除 300 条记录。

您能否建议任何方法从没有创建索引的大表中删除记录。

【问题讨论】:

  • 光标将是性能最低的选项。你怎么知道要删除哪些行?
  • 还有另一个表有 id 要删除,我们获取 300 条记录并将这些 id 提供给我们需要删除的表。为此,我使用 FOR LOOP CURSOR。
  • 此表上没有创建索引 - 只是为了澄清一下,它甚至有一个主键(根据定义是索引的)?您是否有主键 ID 来识别需要删除的记录?真正的问题可能是在这里使用光标,这听起来完全没有必要(根据上面 HoneyBadger 的注释 - 在所有条件相同的情况下,这将是最糟糕的选择)。

标签: sql oracle plsql sql-delete


【解决方案1】:

您可以使用简单的EXISTS,而不是使用循环:

DELETE 
  FROM main_table mt
 WHERE EXISTS (SELECT 1
                 FROM another_table
                WHERE some_id = mt.same_id);

JOIN表格:

DELETE 
  FROM main_table
 WHERE rowid IN (SELECT mt.rowid
                   FROM main_table mt
                        INNER JOIN other_table ot ON mt.some_id = ot.same_id);

【讨论】:

  • 或者只是一个内部连接?
  • @topsail,这通常不是我想要的,为了完整起见,它包含了一个变体。谢谢你的建议!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-24
  • 2014-07-11
相关资源
最近更新 更多