--说明:两个表的SERIAL_NUMBER,OUT_PROCESS_TIME都分别建立了索引
--TEMP.G_SN_STATUS表的资料大概有几千万,TEMP.G_SN_TRAVEL表的数据应该是TEMP.G_SN_STATUS的十几倍
--SQL1秒出结果(数据大概在100多条)
SELECT A.WORK_ORDER, A.SERIAL_NUMBER
FROM TEMP.G_SN_STATUS A
WHERE A.OUT_PROCESS_TIME>SYSDATE-0.00001;
--SQL2完全跑不动(这个SQL该如何优化,我总感觉这个跑不出来不科学啊)
SELECT A.WORK_ORDER, A.SERIAL_NUMBER, C.OUT_PROCESS_TIME AS INPUT_TIME
FROM TEMP.G_SN_STATUS A
INNER JOIN TEMP.G_SN_TRAVEL C ON A.SERIAL_NUMBER=C.SERIAL_NUMBER
WHERE A.OUT_PROCESS_TIME>SYSDATE-0.00001;
--把SQL1查询出的SERIAL_NUMBER In进去秒出结果
SELECT * FROM TEMP.G_SN_TRAVEL
WHERE SERIAL_NUMBER IN (....)
好久没有发帖子,
sql SELECT A.WORK_ORDER, A.SERIAL_NUMBER, C.OUT_PROCESS_TIME AS INPUT_TIME FROM (select * from TEMP.G_SN_STATUS A WHERE A.OUT_PROCESS_TIME > SYSDATE-0.00001) A INNER JOIN TEMP.G_SN_TRAVEL C ON A.SERIAL_NUMBER=C.SERIAL_NUMBER
;
两个表,千万级和10亿级别关联,产生的笛卡尔积何其的大。你既然能用WHERE A.OUT_PROCESS_TIME>SYSDATE-0.00001 把TEMP.G_SN_STATUS表过滤到100条,为啥不用这个条件再去和 TEMP.G_SN_TRAVEL关联呢? 所以可以改写成:
WITH TEMP AS
(SELECT A.WORK_ORDER, A.SERIAL_NUMBER
FROM TEMP.G_SN_STATUS A
WHERE A.OUT_PROCESS_TIME > SYSDATE - 0.00001)
SELECT A.WORK_ORDER,
A.SERIAL_NUMBER,
C.OUT_PROCESS_TIME AS INPUT_TIME
FROM TEMP.G_SN_TRAVEL C
INNER JOIN TEMP A
ON A.SERIAL_NUMBER = C.SERIAL_NUMBER