如何优化SELECT查询?

时间:2019-11-05 00:45:33

标签: sql oracle

我有一个表,其中包含系统的所有日志。它包含项目的插入和更新日志。我的查询根据系统上次检查更新的时间检查最新更新。

这是我的查询:

SELECT LCINDIV.CLIENTID, LCINDIV.COID, BIRTHDAY, NATIONAL, ACRNO, CIVSTAT, GENDER, RELIGION, SSSID, TIN, RESCERT, EDUCLV, DEGREE, RESIDENT, LNAME, FNAME, MNAME, DTPLRES, NATIONLT, LCINDIV.SERVERUPDATE
FROM LCINDIV
LEFT OUTER JOIN LCCLIENT
    ON LCCLIENT.CLIENTID = LCINDIV.CLIENTID
WHERE
   AUDITKY IN (SELECT AUDITKY FROM LSAUDIT WHERE ENTRYDT > '04-Nov-2019' AND ENTRYTM > '15:15:10')

这是我的查询要执行的操作,如果AUDITKY在表LSAUDIT的AUDITKY中,则ENTRYDT大于当前日期,而ENTRYTM大于当前时间。

我的问题是,当我执行此查询时,大约需要30-60秒才能执行。有什么办法可以改善我的SQL查询?

表规格:
LCCLIENT-5,000多行
LCINDIV-5,000多行
LSUDIT-5,000,000多行

表结构:

  

LSAUDIT表

AUDITNO CHAR
AUDITTP CHAR
AUDITKY CHAR
ENTRYBY CHAR
ENTRYDT日期
ENTRYTM CHAR
< / p>

2 个答案:

答案 0 :(得分:1)

我会去EXISTS。请注意,您的LEFT JOIN实际上是INNER JOIN,所以:

SELECT LCINDIV.CLIENTID, LCINDIV.COID, BIRTHDAY, NATIONAL, ACRNO,
       CIVSTAT, GENDER, RELIGION, SSSID, TIN, RESCERT, EDUCLV,
       DEGREE, RESIDENT, LNAME, FNAME, MNAME, DTPLRES, NATIONLT,
       LCINDIV.SERVERUPDATE
FROM LCINDIV JOIN
     LCCLIENT
     ON LCCLIENT.CLIENTID = LCINDIV.CLIENTID
WHERE EXISTS (SELECT 1
              FROM LSAUDIT
              WHERE LSAUDIT.AUDITKY = LCCLIENT.AUDITKEY AND
                    (LSAUDIT.ENTRYDT > TRUNC(SYSDATE) OR
                     LSAUDIT.ENTRYDT = TRUNC(SYSDATE) AND LSAUDIT.ENTRYTM > TO_CHAR(SYSDATE, 'HH24:MI:SS')
                    )
              );

对于性能,LSAUDIT(AUDITKY, ENTRYDT, ENTRYTM)上的索引会有所帮助。

答案 1 :(得分:0)

我有2条建议。

  
      
  1. 使用存在而不是IN
  2.   
  3. 合并您的日期和时间
  4.   
SELECT LCINDIV.CLIENTID
    , LCINDIV.COID, BIRTHDAY
    , NATIONAL, ACRNO, CIVSTAT, GENDER, RELIGION, SSSID, TIN, RESCERT
    , EDUCLV, DEGREE, RESIDENT, LNAME, FNAME, MNAME, DTPLRES, NATIONLT, LCINDIV.SERVERUPDATE
FROM LCINDIV
LEFT OUTER JOIN LCCLIENT
    ON LCCLIENT.CLIENTID = LCINDIV.CLIENTID
WHERE
   EXISTS (SELECT 1 FROM LSAUDIT WHERE
     to_date(ENTRYDT||ENTRYTM, 'dd-mon-yyyy hh24:mi:ss') > to_date('04-Nov-2019'||'15:15:10', 'dd-mon-yyyy hh24:mi:ss'))