首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调优与性能

调优与性能
EN

Stack Overflow用户
提问于 2014-06-02 22:06:09
回答 3查看 84关注 0票数 0
代码语言:javascript
复制
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查询的好链接。

提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-02 23:28:23

我发现IN从句的速度很慢。我将重写不存在的查询。

代码语言:javascript
复制
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上的索引。这可能不会真正解决您的问题,但是如果不知道数据模型和索引,这可能是值得一试的。

票数 1
EN

Stack Overflow用户

发布于 2014-06-02 22:17:07

除了已经给出的好建议之外,每当您在表中插入大量记录时,最好将索引删除到该表中。当插入过程完成后,然后重新创建索引。

票数 0
EN

Stack Overflow用户

发布于 2014-06-02 22:32:52

这个谓词有多大的选择性?

代码语言:javascript
复制
A.MED_DTL_STATUS='0'

如果它过滤掉表中的大部分行,那么在MED_DTL_STATUS上创建一个索引可能会有帮助。

请注意,Oracle对in有(或至少曾经有)1000项的限制:如果您的子查询开始返回的行数比返回的行多,您将得到一个错误(如果/当这种情况发生时,可以使用左外部联接重写这个IN )。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24004069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档