我正在尝试优化具有删除功能的查询。查询包含多个条件和删除记录的组合。
Delete from table1 where (trunc(date) ='4-Jan-2023' AND ID=12) OR (trunc(date) ='4-Jan-2023' AND ID=13) OR
(trunc(date) ='4-Jan-2023' AND ID=12) OR
.
.
.
.
.
(trunc(date) ='4-Jan-2023' AND ID=14);
请给我解决方案。
我想优化这个查询。
当您将
trunc
函数应用于 date
列时(这很可能不是它的真实名称,是吗?date
是一个保留字,为数据类型名称保留),然后 - 如果该列上有索引- 它不会被使用。创建一个基于函数的索引:
create index i1_t1_datum on table1 (trunc(datum));
或切换到
where datum >= date '2023-01-04'
and datum < date '2023-01-05'
此外,您还强制进行数据类型隐式转换,以便将
date
数据类型值与字符串进行比较('4-Jan-2023'
是一个字符串)。
由于所有日期值都相同并且
ID
s 发生变化,因此将它们移动到 in
子句中。
因此,如果您对
where
子句中涉及的列进行索引,收集统计信息(关于模式;如果没有,那么 - 至少 - 在表和索引上)并使用这样的查询,它可能(或没有)帮助:
delete from table1
where datum >= date '2023-01-04'
and datum < date '2023-01-05'
and id in (12, 13, 14);
考虑解释该语句,以便您了解数据库的真正作用。