sql - 插入查询的性能调优

标签 sql database oracle performance

有人可以帮助我调整这个查询,因为我是 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 ... 语句。

关于sql - 插入查询的性能调优,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50549595/

相关文章:

sql - 选择查询返回列包含域名的所有行

mysql - 将单个非重复数据存储到数据库的最佳方法是什么?

mysql - 在MySQL中,如何更改最大并发连接数?

sql - 创建一个已经存在的 SQL 表会覆盖它吗?

oracle - ORA-00932 不一致的数据类型 : expected - got BLOB

sql - 如何从最接近table1的DATE FIELD的table2中提取数据?

sql - PostgreSQL 中的数组数组

json - Swift 3 & JSON – 如何编辑从数据库接收到的数据?

sql - 在 Oracle 中描述查询结果的模式?

sql - 仅基于更改日志数据重建历史表行