【DB笔试面试623】在Oracle中,给出下面语句的可能的优化思路。
♣
题目部分
在Oracle中,给出下面语句的可能的优化思路。
1CREATE TABLE T_YH_20170705_LHR( X INT);
2BEGIN
3 FOR I IN 1 .. 100000 LOOP
4 EXECUTE IMMEDIATE 'INSERT INTO T_YH_20170705_LHR VALUES ( '||I||')';
5 COMMIT;
6 END LOOP;
7END;
♣
答案部分
优化思路有:①采用绑定变量;②使用静态SQL;③采用批量提交或循环外提交;④根据功能,可以去掉PL/SQL块,采用直接一次性插入的方式来完成,SQL为“INSERT INTO T_YH_20170705_LHR SELECT ROWNUM FROM DUAL CONNECT BY LEVEL<=100000;”;⑤采用直接路径方式,例如,“CREATE TABLE T_YH_20170705_LHR AS SELECT ROWNUM X FROM DUAL CONNECT BY LEVEL<=100000;”;⑥采用NOLOGGING和PARALLEL的方式,例如,“CREATE TABLE T_YH_20170705_LHR NOLOGGING PARALLEL 8 AS SELECT ROWNUM X FROM DUAL CONNECT BY LEVEL<=100000;”。
实验如下所示:
1DROP TABLE T_YH_20170705_LHR PURGE;2CREATE TABLE T_YH_20170705_LHR( X INT);3ALTER SYSTEM FLUSH SHARED_POOL;4CREATE OR REPLACE PROCEDURE PRO_YH_LHR5AS6BEGIN7 FOR I IN 1 .. 100000 LOOP8 EXECUTE IMMEDIATE 'INSERT INTO T_YH_20170705_LHR VALUES ( '||I||')';9 COMMIT;
10 END LOOP;
11END;
12/
13SET TIMING ON
14EXEC PRO_YH_LHR; --Elapsed: 00:00:59.45
首次实验需要40秒完成,因为未用绑定变量:
1SELECT T.SQL_TEXT, T.SQL_ID,T.PARSE_CALLS, T.EXECUTIONS
2 FROM V$SQL T
3 WHERE SQL_TEXT LIKE 'INSERT INTO T_YH_20170705_LHR VALUES%';
一、 采用绑定变量
1DROP TABLE T_YH_20170705_LHR PURGE;2CREATE TABLE T_YH_20170705_LHR( X INT);3ALTER SYSTEM FLUSH SHARED_POOL;4CREATE OR REPLACE PROCEDURE PRO_YH_LHR25AS6BEGIN7 FOR I IN 1 .. 100000 LOOP 8 EXECUTE IMMEDIATE 'INSERT INTO T_YH_20170705_LHR VALUES ( :X )' USING I;9 COMMIT;
10 END LOOP;
11END;
12/
13SET TIMING ON
14EXEC PRO_YH_LHR2; --Elapsed: 00:00:08.14
15
16--采用绑定变量后,8秒钟执行完成。SQL解析次数也变为了1次:
17SELECT T.SQL_TEXT, T.SQL_ID,T.PARSE_CALLS, T.EXECUTIONS
18 FROM V$SQL T
19 WHERE SQL_TEXT LIKE 'INSERT INTO T_YH_20170705_LHR VALUES%';
二、 将动态SQL改造成静态SQL
1DROP TABLE T_YH_20170705_LHR PURGE;2CREATE TABLE T_YH_20170705_LHR ( X INT);3ALTER SYSTEM FLUSH SHARED_POOL;4CREATE OR REPLACE PROCEDURE PRO_YH_LHR35AS6BEGIN7 FOR I IN 1 .. 100000 LOOP 8 INSERT INTO T_YH_20170705_LHR VALUES (I);9 COMMIT;
10 END LOOP;
11END;
12/
13SET TIMING ON
14EXEC PRO_YH_LHR3; --Elapsed: 00:00:05.99
15
16--改造后6秒钟即可完成,再次查看解析情况:
17SELECT T.SQL_TEXT, T.SQL_ID,T.PARSE_CALLS, T.EXECUTIONS
18 FROM V$SQL T
19 WHERE SQL_TEXT LIKE 'INSERT INTO T_YH_20170705_LHR VALUES%';
静态SQL会自动使用绑定变量。
三、 循环外提交
1DROP TABLE T_YH_20170705_LHR PURGE;2CREATE TABLE T_YH_20170705_LHR ( X INT);3ALTER SYSTEM FLUSH SHARED_POOL;4CREATE OR REPLACE PROCEDURE PRO_YH_LHR45AS6BEGIN7 FOR I IN 1 .. 100000 LOOP 8 INSERT INTO T_YH_20170705_LHR VALUES (I);9END LOOP;
10 COMMIT;
11END;
12/
13SET TIMING ON
14EXEC PRO_YH_LHR4; --Elapsed: 00:00:04.75
5秒即可完成。
四、 去掉存储过程,采用插入表的写法
1DROP TABLE T_YH_20170705_LHR PURGE;
2CREATE TABLE T_YH_20170705_LHR( X INT);
3ALTER SYSTEM FLUSH SHARED_POOL;
4SET TIMING ON
5INSERT INTO T_YH_20170705_LHR SELECT ROWNUM FROM DUAL CONNECT BY LEVEL<=100000;--Elapsed: 00:00:00.01
6COMMIT;
7SELECT COUNT(*) FROM T_YH_20170705_LHR;
用了0.01秒,太快了。由于要使用到Data Buffer,所以下面采用直接路径。
五、 直接路径
1DROP TABLE T_YH_20170705_LHR PURGE;
2ALTER SYSTEM FLUSH SHARED_POOL;
3SET TIMING ON
4CREATE TABLE T_YH_20170705_LHR AS SELECT ROWNUM X FROM DUAL CONNECT BY LEVEL<=100000;
六、 并行原理
1DROP TABLE T_YH_20170705_LHR PURGE;
2ALTER SYSTEM FLUSH SHARED_POOL;
3SET TIMING ON
4CREATE TABLE T_YH_20170705_LHR NOLOGGING PARALLEL 8 AS SELECT ROWNUM X FROM DUAL CONNECT BY LEVEL<=100000;
本文选自《Oracle程序员面试笔试宝典》,作者:李华荣。
---------------优质麦课------------
详细内容可以添加麦老师微信或QQ私聊。
About Me:小麦苗
● 本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用
● 作者博客地址:http://blog.itpub.net/26736162/abstract/1/
● 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解
● 版权所有,欢迎分享本文,转载请保留出处
● QQ:646634621 QQ群:618766405
● 提供OCP、OCM和高可用部分最实用的技能培训
● 题目解答若有不当之处,还望各位朋友批评指正,共同进步
DBA宝典
长按下图识别二维码或微信扫描下图二维码来关注小麦苗的微信公众号:xiaomaimiaolhr,学习最实用的数据库技术。
喜欢就点击“好看”吧
【DB笔试面试623】在Oracle中,给出下面语句的可能的优化思路。相关推荐
- 【DB笔试面试164】在Oracle中,如何彻底停止expdp数据泵进程?
[DB笔试面试164]在Oracle中,如何彻底停止expdp数据泵进程? 真题1. 如何彻底停止 expdp 进程? 答案:许多同事在使用expdp命令时,不小心按了CTRL+C组合键,然后又输入e ...
- oracle查大事务语句,查询Oracle 中死事务的语句
查询Oracle 中死事务的语句 SQL> SELECT KTUXEUSN, KTUXESLT, KTUXESQN, /* Transaction ID */ 2 KTUXESTA Statu ...
- oracle中执行某sql语句后,如一系列delete、update等操作,怎么看影响的行数?如我执行了n个表的delete语句,得看我删除了多少数据,万一sql写的有问题,误删了数据,不是灾难?
oracle中执行某sql语句后,如一系列delete.update等操作,怎么看影响的行数?如我执行了n个表的delete语句,得看我删除了多少数据,万一sql写的有问题,误删了数据,不是灾难? 使 ...
- 【DB笔试面试594】在Oracle中,关键字NOLOGGING、APPEND和PARALLEL提高DML性能方面有什么差别?...
♣题目部分 在Oracle中,关键字NOLOGGING.APPEND和PARALLEL提高DML性能方面有什么差别? ♣答案部分 众所周知,表模式(LOGGING/NOLOGGING).插入模式(AP ...
- 【DB笔试面试608】在Oracle中,如何使用STA来生成SQL Profile?
♣题目部分 在Oracle中,如何使用STA来生成SQL Profile? ♣答案部分 利用STA对语句进行优化后,STA会对语句进行分析,采用最优的优化策略,并给出优化后的查询计划.可以按照STA给 ...
- 【DB笔试面试622】在Oracle中,说说COUNT(*)计算行数有哪些优化手段?
♣ 题目部分 在Oracle中,说说COUNT(*)计算行数有哪些优化手段? ♣ 答案部分 手段 命令 执行计划 主要原理 详细说明 性能情况 全表扫描 TABLE ACCESS FULL 全表扫描 ...
- 【DB笔试面试606】在Oracle中,coe_xfr_sql_profile.sql脚本的作用是什么?
♣题目部分 在Oracle中,coe_xfr_sql_profile.sql脚本的作用是什么? ♣答案部分 使用coe_xfr_sql_profile.sql脚本生成sqlprof_attr数据 最麻 ...
- 【DB笔试面试597】在Oracle中,获取执行计划有哪几种方法?
♣题目部分 在Oracle中,获取执行计划有哪几种方法? ♣答案部分 一般来说,有如下几种获取执行计划的方式: 1.AUTOTRACE方式 AUTOTRACE是Oracle自带的客户端工具SQL*Pl ...
- 【DB笔试面试713】在Oracle中,如何将一个数据库添加到CRS中?
♣ 题目部分 在Oracle中,如何将一个数据库添加到CRS中? ♣ 答案部分 虽然通过DBCA(DataBase Configuration Assistant,数据库配置助手)创建的数据库会自动加 ...
最新文章
- 判别模型和生成模型的区别
- 线性表—单向循环链表
- Mirror--镜像使用的工作线程数
- yum报错[Errno 256] No more mirrors to try.
- [css] 请问class与[class=xxx]的区别是什么?两者是否等价?
- java webservice soap请求_使用Java对WebService的SOAP请求
- Python 源码剖析(一)—— vs2013 编译 python 源码
- 红包随机分配问题php,自己写仿微信红包的随机分配,为什么平均数差距这么大?...
- Redis--位图BitMap
- php链接mysql数据库 p_php连接mysql数据库的几种方法
- 开发板与虚拟机tftp服务器安装与使用
- solidworks迈迪设计宝_机械入门|那些看起来很牛X的机械结构,是如何设计的?...
- 项目实战:十种方法实现图像数据集降维
- word行首空格下划线_word空格处加下划线 word空格处下划线
- 用python和sympy库解决方程组问题_使用 Python 解数学方程
- Linux就业技术指导(四):企业CDN缓存加速原理解密
- Hive SQL复杂场景实现(1) —— 连续发单天数
- 图:美国首颗“嗅碳”卫星发射失败坠海
- Protractor 怎么编写自动化测试用例
- PHD数据库介绍(一)