首页 > 解决方案 > 插入查询的性能调整

问题描述

有人可以帮助我调整此查询,因为我是 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);

标签: sqldatabaseoracleperformance

解决方案


要调整 INSERT 查询,您需要以下成分:

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

  2. 测试表需要具有与真实表完全相同的结构以及与真实表大致相同的数据量。原因: INSERT 的性能在很大程度上取决于结构和数量。

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

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

当我需要调整INSERT语句时,我通常从该SELECT部分开始,直到我满意为止。首先运行SELECT ...,如果没问题,我运行 aCREATE TABLE foo NOLOGGING AS SELECT ...来测量所有行的 SELECT。如果没问题,我会测试整个INSERT ... SELECT ...语句。


推荐阅读