我在程序中有以下删除语句:
delete t_excuse
where EMP_NO = AL_EMPNO
AND TO_CHAR(EXCUSE_DATE,'yyyymmdd') BETWEEN LS_STARTDATE_G AND LS_ENDDATE_G;
在10秒左右缓慢。
但是当我添加任何具有相同where子句的select然后执行删除时,它很快。
select count(*)
into v_avariable from t_excuse
where EMP_NO = AL_EMPNO
AND TO_CHAR(EXCUSE_DATE,'yyyymmdd') BETWEEN LS_STARTDATE_G AND LS_ENDDATE_G;
delete t_excuse
where EMP_NO = AL_EMPNO
AND TO_CHAR(EXCUSE_DATE,'yyyymmdd') BETWEEN LS_STARTDATE_G AND LS_ENDDATE_G;
答案 0 :(得分:0)
LS_STARTDATE_G AND之间的TO_CHAR(EXCUSE_DATE,'yyyymmdd') LS_ENDDATE_G
为什么要将literal
与date
进行比较?避免使用implicit conversion
。如果列的数据类型为DATE
,则只需使用日期列,TO_CHAR
将以您希望的格式显示,TO_DATE
用于操作。
delete t_excuse
where EMP_NO = AL_EMPNO
AND EXCUSE_DATE BETWEEN to_date(LS_STARTDATE_G,'yyyymmdd')
AND to_date(LS_ENDDATE_G,'yyyymmdd');
如果您在EXCUSE_DATE
列上有索引,那么现在Oracle将使用index
。使用新查询检查解释计划。
编辑如果您真的想摆脱时间部分,请使用TRUNC
。但是,这会抑制INDEX
的使用。您需要将function-based
索引创建为TRUNC(EXCUSE_DATE)
。