sql - 插入查询的性能调整
问题描述
有人可以帮助我调整此查询,因为我是 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 ...
,如果没问题,我运行 aCREATE TABLE foo NOLOGGING AS SELECT ...
来测量所有行的 SELECT。如果没问题,我会测试整个INSERT ... SELECT ...
语句。
推荐阅读
- python - 无法安装 pyspark
- redux-form - 使用 redux-form 示例规范化日期输入
- android - requestNetworkScan - 返回无效的小区标识 - Android P
- c# - 要发布哪些文件?ASP .Net 核心 2.0
- ios - 为什么 #available(iOS 11, *) 在 iOS 12 上解析为 true?
- kubernetes - 有没有办法让两个具有相同应用程序的容器连接到 Kubernetes 上的同一个数据库?
- powershell - 使用通配符作为驱动器号启动进程
- android - 使用 Firebase-UI、Firestore 作为数据库和 Picasso 时,图像不会出现在 RecyclerView 中
- c - 加速包含事件的 ODE 的并行求解
- php - Smarty输出动态变量