删除语句中的并行提示

问题描述 投票:0回答:1

我们有一张表,有 1300 万行。我们正在做一些计算,最后我们尝试删除 qty=0 行(实际上大约有 500 万行)。

我正在使用这个查询:

DELETE /*+ PARALLEL(8) */ FROM Table_Name WHERE QTY = 0;

删除这 500 万行需要超过 12 分钟。

知道如何通过使用其他选项来减少时间吗?

谢谢, 电信标准化局

oracle
1个回答
0
投票

根据 Oracle 博客上的测试,当涉及到从表中删除大量记录时,通常的删除语法是最慢的。 正如here所解释的,我认为您可以为此构建一个结构:

  1. 创建一个新表来保存您想要保留的行
  2. 截断原始表
  3. 使用 insert as select 重新加载保存的行

这意味着在您的情况下,创建一个包含值的表

create table rows_to_keep
  select * 
  from table_name 
  where  qty != 0;

truncate table table_name;

insert into table_name
select * from rows_to_keep;

更好的是,您可以使用交换逻辑 其过程类似:

  1. 创建一个新表来保存您想要保留的行
  2. 删除或重命名原始表
  3. 将新表重命名为原始表
create table rows_to_keep
  select * from table_name
  where quantity != 0;

rename table_name
  to table_archived;

rename rows_to_keep
  to table_name;
© www.soinside.com 2019 - 2024. All rights reserved.