【问题标题】:Performance Tuning for an insert query插入查询的性能调整
【发布时间】:2018-11-06 01:22:22
【问题描述】:

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

【问题讨论】:

  • 为三个源表添加解释计划和表结构。
  • 您可以先将 NVL(pat_id, 'NULL') 替换为 pat_id。然后可以使用 pat_id 上的索引(如果有的话)。
  • 了解每个表中有多少行会很有帮助。有没有索引?目前需要多长时间?执行计划是什么? xplanx.sql
  • 你能解释一下NVL(pat_id, 'NULL')的原因吗?表mdm_id_relation 中有字符串值NULL 的值吗? SELECT count(*) FROM mdm_id_relation WHERE pat_id = 'NULL'

标签: sql database oracle performance


【解决方案1】:

要调整 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 ... 语句。

【讨论】:

    【解决方案2】:

    任何性能问题都将是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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多