[英]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查询,您需要以下要素:
测试您的查询的地方。 理想情况下,请使用单独的数据库,但也可以使用单独的架构。 最少复制所涉及的表和索引。 原因: INSERT会更改数据,您需要运行不同版本的查询,直到对性能满意为止。
测试表必须具有与真实表完全相同的结构,并且数据量应与真实表大致相同。 原因: INSERT的性能在很大程度上取决于结构和数量。
最新统计信息:查找DBMS_STATS.GATHER_TABLE_STATS
以及如何使用它。 原因:使查询优化器有机会找到一个好的查询计划。
一种衡量性能(挂钟秒数或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.