如何优化SELECT查询?

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

这是我的查询:

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

sdqzangel 回答:如何优化SELECT查询?

我会去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)上的索引会有所帮助。

,

我有2条建议。

  
      
  1. 使用存在而不是IN
  2.   
  3. 合并您的日期和时间
  4.   
SELECT LCINDIV.CLIENTID,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'))
本文链接:https://www.f2er.com/3162950.html

大家都在问