INSERT INTO <TABLED>
SELECT A.* FROM
<TABLEA> A WHERE A.MED_DTL_STATUS='0'
AND A.TRANS_ID
NOT IN
(
SELECT DISTINCT TRANS_ID_X_REF FROM <TABLEB>
UNION
SELECT DISTINCT TRANS_ID FROM <TABLEA> WHERE ADJUSTMENT_TYPE='3'
);该表有超过250列。Select语句将返回300000多条记录,上面的.The查询运行了很长一段时间,我从来没有做过性能tuning.Could,请有人帮我调优,或者给我一些关于如何调优oracle查询的好链接。
提前谢谢。
发布于 2014-06-02 23:28:23
我发现IN从句的速度很慢。我将重写不存在的查询。
INSERT INTO <TABLED>
SELECT A.* FROM <TABLEA> A
WHERE A.MED_DTL_STATUS='0'
AND NOT EXISTS (
SELECT B.TRANS_ID_X_REF
FROM <TABLEB> B
WHERE B.TRANS_ID_X_REF = A.TRANS_ID
)
AND NOT EXISTS (
SELECT A2.TRANS_ID
FROM <TABLEA> A2
WHERE A2.TRANS_ID = A.TRANS_ID
AND A2.ADJUSTMENT_TYPE='3'
);上面的查询假设TRANS_ID上有TableA和TableB上的索引。这可能不会真正解决您的问题,但是如果不知道数据模型和索引,这可能是值得一试的。
发布于 2014-06-02 22:17:07
除了已经给出的好建议之外,每当您在表中插入大量记录时,最好将索引删除到该表中。当插入过程完成后,然后重新创建索引。
发布于 2014-06-02 22:32:52
这个谓词有多大的选择性?
A.MED_DTL_STATUS='0'如果它过滤掉表中的大部分行,那么在MED_DTL_STATUS上创建一个索引可能会有帮助。
请注意,Oracle对in有(或至少曾经有)1000项的限制:如果您的子查询开始返回的行数比返回的行多,您将得到一个错误(如果/当这种情况发生时,可以使用左外部联接重写这个IN )。
https://stackoverflow.com/questions/24004069
复制相似问题