此查询需要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')
答案 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
表数据的较小子集。
正如其他人所推荐的那样,在用于连接和过滤条件的列上创建索引会很有用。