有人可以帮助我调整这个查询,因为我是 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 查询,您需要以下成分:
测试查询的地方。理想情况下,一个单独的数据库,但一个单独的模式也可以。至少是所涉及的表和索引的副本。 原因: INSERT 将更改数据,您需要运行不同版本的查询,直到您对性能感到满意为止。
测试表需要与真实表具有完全相同的结构以及与真实表大致相同的数据量。 原因:INSERT 的性能在很大程度上取决于结构和数量。
最新统计数据:查找
DBMS_STATS.GATHER_TABLE_STATS
以及如何使用它。 原因:让查询优化器有机会找到好的查询计划。一种衡量性能的方法(挂钟秒数或 Oracle 成本等),更好的是,访问查询计划(SQL Developer:“解释计划”按钮,或查看 William 的脚本)。
当我需要调整 INSERT
语句时,我通常从 SELECT
部分开始,直到我对它感到满意为止。首先运行 SELECT ...
,如果没问题,我会运行 CREATE TABLE foo NOLOGGING AS SELECT ...
来测量所有行的 SELECT。如果没问题,我会测试整个 INSERT ... SELECT ...
语句。
关于sql - 插入查询的性能调优,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50549595/