繁体   English   中英

插入查询的性能调优

[英]Performance Tuning for an insert query

有人可以帮助我调整此查询,因为我是oracle性能调整的新手。

INSERT INTO mdm_id_relation
    SELECT 
        pat_key, hub_pat_id, msa_pat_id, pat_id
    FROM 
        ods_raw_patient_mdm_process p1
    WHERE NVL (pat_id, 'NULL') IN (SELECT pat_id
                                   FROM mdm_id_relation)
      AND NOT EXISTS (SELECT pat_key
                      FROM mdm_id_relation p2
                      WHERE p1.pat_key = p2.pat_key);

要调优INSERT查询,您需要以下要素:

  1. 测试您的查询的地方。 理想情况下,请使用单独的数据库,但也可以使用单独的架构。 最少复制所涉及的表和索引。 原因: INSERT会更改数据,您需要运行不同版本的查询,直到对性能满意为止。

  2. 测试表必须具有与真实表完全相同的结构,并且数据量应与真实表大致相同。 原因: INSERT的性能在很大程度上取决于结构和数量。

  3. 最新统计信息:查找DBMS_STATS.GATHER_TABLE_STATS以及如何使用它。 原因:使查询优化器有机会找到一个好的查询计划。

  4. 一种衡量性能(挂钟秒数或Oracle成本等)的方法,甚至可以更好地访问查询计划(SQL Developer:“解释计划”按钮,或者看看William的脚本)。

当我需要调整INSERT语句时,我通常从SELECT部分开始,直到对它满意为止。 首先运行SELECT ... ,这很好,我运行CREATE TABLE foo NOLOGGING AS SELECT ...来测量所有行的SELECT。 当那没问题时,我将测试整个INSERT ... SELECT ...语句。

性能的任何问题都将是select ,而不是insert 我认为这是一个等效的查询:

INSERT INTO mdm_id_relation (pat_key, hub_pat_id, msa_pat_id, pat_id) -- always list the columns!
    SELECT pat_key, hub_pat_id, msa_pat_id, pat_id
    FROM ods_raw_patient_mdm_process p1
    WHERE EXISTS (SELECT 1
                  FROM mdm_id_relation mir
                  WHERE mir.pat_id = p1.pat_id
                 ) AND
          NOT EXISTS (SELECT 1
                      FROM mdm_id_relation mir
                      WHERE p1.pat_key = mir.pat_key
                     );

对于此查询,您需要两个索引: mdm_id_relation(pat_id)mdm_id_relation(pat_key) 这些应该对性能有很大帮助。

注意:在插入之前,先测试select

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM