Oracle - 在小表中删除语句缓慢

时间:2014-10-30 08:01:06

标签: oracle plsql sql-delete

我在程序中有以下删除语句:

   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; 

1 个答案:

答案 0 :(得分:0)

  LS_STARTDATE_G AND之间的

TO_CHAR(EXCUSE_DATE,'yyyymmdd')   LS_ENDDATE_G

为什么要将literaldate进行比较?避免使用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)