从巨大的表中删除多个记录

时间:2018-08-22 07:35:38

标签: oracle database-performance delete-row

我想从Oracle数据库中包含1000万条记录的表中删除一些记录(10万条记录)。当我尝试使用以下查询删除记录

DELETE from TEST where ID in (1,2,3,4,1000,,, etc)

似乎有1000个值的限制,因此出现以下错误:

SQL Error: ORA-01795: maximum number of expressions in a list is 1000

是否有任何查询可以在不使用PL / SQL的情况下在单个语句中删除1000条以上的记录?

我正在考虑以下内容-请提出正确的查询:

DELETE  from TEST where ID in (1,2,3,4,1000)
AND
DELETE  from TEST where ID in (1001,1002);

还请告知使用或不使用主键的删除操作是否会更快。

2 个答案:

答案 0 :(得分:2)

(从我的角度来看,最简单的选择是将巨大列表存储到表中,然后

Function1("query", 
    "URL=https://clients1.google.com/tbproxy/af/query?client=Google+Chrome&q=Chc2LjEuMTcxNS4xNDQyL2VuIChHR0xMKRMZPd2PDK1PW1YjLQScNYckIy0DFGhXJCMt1XOH3CQjLd4_k74kIy1QDijrJCMtdQCYzyQjLRkUiZIkIy3xrEvRJCMtc6vwHyQjLa44BcEkIy0ghfciJCMtgsHVLSQU", 
    "TargetFrame=", 
    "Resource=1", 
    "RecContentType=text/proto", 
    "Referer=", 
    "Snapshot=t103.inf", 
    LAST);

使用主键会更快吗?我想这不是主键的重要问题,而是是否对某些内容进行了索引(不必是主键)。但是,Oracle真的会使用该索引吗?谁知道;取决于优化器。它可能选择全表扫描更合适。检查说明计划。

答案 1 :(得分:1)

如果数据是序列,则可以执行以下操作

Create table seqnumbrs as
select level as id from dual connect by level <= 10000;

Delete from tab1 were id in (select id from seqnumbrs);

您可以在表格上为性能创建pk或索引