SQL Oracle-编写更新和删除查询的更好方法



我在第||id_nr个月索引了大约2.7亿行,下面的更新/删除查询大约需要4个小时才能完成。我想知道是否有其他方法可以更快地进行更新/删除。

更新查询:-

update table_A
set STATUS='Y'
where
month||id_nr in (select distinct month||id_nr from table_A where STATUS='Y');

删除查询:-

Delete from table_B
where
month||id_nr in (select distinct month||id_nr from table_A where STATUS='Y');

为什么要串接?并且永远不要试图强制DBMS使IN子句中的行不同。让DBMS决定它认为查找数据的最佳方法。

所以,只是:

where (month, id_nr) in (select month, id_nr from table_A where status = 'Y');

我想id_nr在table_b中不是唯一的id,否则你就不必把它和月份结合起来看了。因此,一个合适的指数是:

create index idx_b on table_b (id_nr, month);

或者,如果你在一个月里做了很多工作,那么按月对表进行分区可能是个好主意。这可以极大地加快查询、更新和删除的速度。

对于表a,我建议

create index idx_a on table_a (status, id_nr, month);

这是一个覆盖指数。第一列将帮助快速找到所需的行;其他两列将在不必读取表行的情况下可用。

最新更新