我有一个表,其中包含系统的所有日志。它包含项目的插入和更新日志。我的查询根据系统上次检查更新的时间检查最新更新。
这是我的查询:
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>
答案 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条建议。
- 使用存在而不是IN
- 合并您的日期和时间
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'))