TRUNCATE vs DELETE: Oracle SQL性能提升实操指南

需积分: 10 2 下载量 149 浏览量 更新于2024-08-15 收藏 2.32MB PPT 举报
本资源是一份关于ORACLE SQL性能优化的专业培训材料,重点讨论了如何通过TRUNCATE命令替代DELETE操作以提高数据库性能。在数据库管理中,当删除表中的记录时,DELETE操作通常会在回滚段中保存可恢复的数据,如果在事务未提交的情况下,这些数据可能会被回滚到删除前状态,导致资源消耗和较长的执行时间。相比之下,TRUNCATE命令更为高效,它不保留任何可以恢复的数据,直接清空表内容,因此回滚段占用更少资源,执行速度更快。 课程内容涵盖了SQL优化的基础知识,包括性能管理的重要性、性能问题的识别与解决策略、SQL优化的基本机制,以及SQL处理过程的深入剖析。讲解了共享SQL区域、SQL处理阶段、共享游标和SQL编码标准等概念。此外,还专门介绍了Oracle的优化器,它是SQL语句执行计划的关键组成部分,能够帮助确定最佳执行路径。 课程深入探讨了SQL优化的具体技巧,如SQL Tuning Tips和常用的优化工具。针对SQL性能不佳的原因,强调了开发人员既要关注查询结果的正确性,又要理解SQL语句执行原理,尤其是对CBO(Cost-Based Optimizer)的理解和利用,这是优化SQL解析和执行效率的关键。 课程的重点集中在应用程序级调优,特别是Oracle SQL语句的优化和管理变化调优。提供了一系列调整方法,包括但不限于调整业务逻辑、数据设计、流程设计、SQL语句本身、物理结构、内存分配、I/O操作以及与操作系统的交互。每种调整方法对应着不同的性能收益,并强调了调整在性能提升中的角色。 这份教程旨在帮助用户理解和实践ORACLE SQL的高效执行,通过深入理解SQL执行原理和优化策略,实现数据库性能的显著提升。
2023-07-13 上传

编译报错 CREATE OR REPLACE PROCEDURE get_dev_cs IS sql_tem VARCHAR2(4000); v_dt NUMBER; BEGIN ----om_subscriber_yyyymm sql_tem := 'truncate table ycyd.Subscriber_cs'; EXECUTE IMMEDIATE sql_tem; FOR v_dt IN (SELECT to_number(substr(table_name, '15')) db FROM sys.all_tables a WHERE a.owner = upper('jour1') AND a.table_name LIKE upper('om_subscriber_202___') AND substr(table_name, '15') > 202205) LOOP -- 循环往b里添加数据 sql_tem := ' INSERT INTO ycyd.Subscriber_cs SELECT a.order_id, a.done_date, a.cust_id, a.subscriber_ins_id, a.access_num FROM jour1.om_subscriber_' || v_dt.db || ' a WHERE a.action = 0 AND a.is_usim = 1'; -- 执行sql EXECUTE IMMEDIATE sql_tem; END LOOP; ----om_order_yyyymm sql_tem := 'truncate table ycyd.order_cs'; EXECUTE IMMEDIATE sql_tem; COMMIT; FOR v_dt IN (SELECT to_number(substr(table_name, '15')) db FROM sys.all_tables a WHERE a.owner = upper('jour1') AND a.table_name LIKE upper('om_subscriber_202___') AND substr(table_name, '15') > 202205) LOOP -- 循环往b里添加数据 sql_tem := ' INSERT INTO ycyd.order_cs SELECT order_id, dev_id FROM JOUR1.om_order_' || v_dt.db || ' b'; -- 执行sql EXECUTE IMMEDIATE sql_tem; END LOOP; COMMIT; ---dev sql_tem := 'truncate table ycyd.yd_order_dev_3056'; EXECUTE IMMEDIATE sql_tem; -- 添加数据 sql_tem := ' INSERT INTO ycyd.yd_order_dev_3056 SELECT a.order_id, a.done_date, a.cust_id, a.subscriber_ins_id, a.access_num, c.dev_id, c.dev_name, d.code, c.dev_busi_code, c.corp_org, c.company_name, c.department_code, c.department_name, c.remarks FROM ycyd.Subscriber_cs a LEFT JOIN ycyd.order_cs b ON a.order_id = b.order_id LEFT JOIN params1.sec_developer c ON b.dev_id = c.dev_id LEFT JOIN (SELECT DISTINCT oo.code,s.bill_id FROM params1.sec_operator oo, params1.sec_staff s WHERE s.staff_id = oo.staff_id AND oo.state = 1 AND oo.staff_id NOT in ('123402933','123395474','123404209')) d ON c.dev_phone = d.bill_id WHERE c.corp_org = 3056'; -- 执行sql EXECUTE IMMEDIATE sql_tem; COMMIT; END get_dev_cs;

2023-07-14 上传
2023-07-13 上传