我想从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);
还请告知使用或不使用主键的删除操作是否会更快。
答案 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或索引