Oracle查询日期范围

时间:2014-04-23 22:43:54

标签: sql oracle

此查询需要16分钟。有更快的方法吗?

select INIT.MPI_MEMHEAD.MEMIDNUM 
from INIT.MPI_MEMHEAD 
inner join INIT.MPI_AUDHEAD 
on INIT.MPI_AUDHEAD.audrecno = INIT.MPI_MEMHEAD.CAUDRECNO 
where(INIT.MPI_AUDHEAD.audctime+0)  >= to_date('01-JAN-14') AND (INIT.MPI_AUDHEAD.audctime+0) <=  to_date('01-APR-14')

3 个答案:

答案 0 :(得分:0)

首先,您可以修改“where(INIT.MPI_AUDHEAD.audctime + 0)&gt; = to_date('01 -JAN-14')AND(INIT.MPI_AUDHEAD.audctime + 0)&lt; = to_date('01 - APR-14')“到”where INIT.MPI_AUDHEAD.audctime between date '01-JAN-14' and date '01-APR-14'“。

其次,如果您总是通过INIT.MPI_AUDHEAD.audctime在一个季度中选择此表,则可以通过audctime将此表更改为分区表。如下:

CREATE TABLE MPI_AUDHEAD(
      audctime DATE
) PARTITION BY RANGE(audctime)
(
PARTITION part01 VALUES LESS THAN (TO_DATE('2014-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss')) TABLESPACE tbs01,
PARTITION part02 VALUES LESS THAN (TO_DATE('2014-04-01 00:00:00','yyyy-mm-dd hh24:mi:ss')) TABLESPACE tbs02,
);

第三,在audctime上添加一个索引。

供您参考。

答案 1 :(得分:0)

您的查询已格式化,因此更容易理解:

select mh.MEMIDNUM 
from INIT.MPI_MEMHEAD mh inner join
     INIT.MPI_AUDHEAD ah
     on ah.audrecno = mh.CAUDRECNO 
where (au.audctime+0)  >= to_date('01-JAN-14') AND (au.audctime+0) <=  to_date('01-APR-14')

我不完全理解where条款。 + 0没有做任何事情。所以,你应该把它转换成:

where au.audctime >= to_date('01-JAN-14') AND au.audctime <= to_date('01-APR-14')

假设audctime采用日期/时间格式,则查询引擎可以利用索引。我的建议是添加以下两个索引:

INIT.MPI_AUDHEAD(audctime, audrecno)
INIT.MPI_MEMHEAD(CAUDRECNO, MEMIDNUM)

这些是覆盖索引,因此查询中提到的所有列都在索引中。此外,他们应该加快where条款和join

答案 2 :(得分:0)

您可以尝试以下修改过的查询:

SELECT mm.MEMIDNUM 
FROM INIT.MPI_MEMHEAD mm
INNER JOIN
    (SELECT ma.audrecno as audrecno
     FROM INIT.MPI_AUDHEAD ma
    WHERE ma.audctime >= to_date('01-JAN-14', 'DD-MON-YY') AND ma.audctime <=  to_date('01-APR-14', 'DD-MON-YY')
    ) filtered_ma
ON filtered_ma.audrecno = mm.CAUDRECNO;

以这种方式重写查询的目的是加入INIT.MPI_AUDHEAD表数据的较小子集。

正如其他人所推荐的那样,在用于连接和过滤条件的列上创建索引会很有用。