Oracle sql 优化の常用方式
1、不要用 '*' 代替所有列名,特别是字段比较多的情况下
使用select * 可以列出某个表的所有列名,但是这样的写法对于Oracle来说会存在动态解析问题。Oracle系统通过查询数据字典将 '*' 转换成表的所有列名,这自然会消耗系统时间。
2、进行全表删除时,用truncate代替delete
当用delete删除表的数据行时,Oracle会使用撤销表空间(UNDO tablespace)来存放恢复的信息。在这期间,如果用户没有发出commit语句,而是发出rollback语句,Oracle系统会将数据恢复到删除之前的状态,当用户使用truncate对表的数据进行删除时,系统不会将被删除的数据写到回滚段(撤销表空间)里,速度自然快些。
3、在确保完整性的情况下多使用commit
在PL/SQL块中,经常将几个相互联系的DML语句写到一个BEGIN...END块中,建议在每个DML语句结尾加上commit,这样可以使用对象DML语句及时提交,同时也释放事务所占用的资源。
4、尽量减少表的查询次数
在含有多个子查询的sql中,要注意减少对表的查询。
示例:
--Inefficient sql
select tab_name1,tab_name2 from table_name
where tab_name1 = (select tab_n1 from table_n)
and tab_name2 = (select tab_n2 from table_n)
--Efficient sql
select tab_name1,tab_name2 from table_name
where (tab_name1,tab_name2)= (select tab_n1,tab_n2 from table_n)
5、使用exists代替in,使用not exists代替not in
在子查询中,in使用一个内部的排序和合并,无论在哪种情况下,not in都是最低效的,因为它对子查询中的表执行了全表遍历,为了避免使用not in,我们可以把它改写为外连接(outer join)或者是not exists。但并不代表not in 完全不可用,我们一分为二来看待此问题:若子查询返回的数据集较复杂,避免使用not in;当子查询返回的数据集较简单或者可枚举,not in也可以使用。
exists和in使用同理。
6、合理使用函数
不合理的函数使用方式会对数据库造成严重的性能问题,即使一个非常简单的函数,因为其使用不当,都可能造成严重的后果。
示例:
--Inefficient sql
for i in 0...10 LOOP
select count(*) into i_cnt from race_results
where horse_name = format_name('xiaobai');
end LOOP;
--Efficient sql
for i in 0...10 LOOP
select count(*) into i_cnt from race_results
where horse_name = (select format_name('xiaobai') from dual);
end LOOP;
当函数在where子句中使用时,查询结果得到的每一行记录均会调用该函数一次。
7、正确选择from表顺序
在基于规则的优化器(Rule-based Optimizer)下,Oracle解析器按照从右至左的顺序处理from后的表名,因此写在from中最后的表将会被先处理,先处理的表也称为驱动表,在from子句中包含多个表的情况下,建议选择数据量最少的表作为驱动表。原因:当Oracle处理多个表时,会运用排序或合并的方式连接它们。首先,系统扫描from中最后的表,并对该表的数据进行排序;然后,扫描from中倒数第二个表;最后,将所有从第二个表中检索出来的记录和第一个表中的合适记录进行合并,取交集。
如果有三个以上的表连接,则建议使用交叉表(intersection table)作为驱动表,所谓交叉表指的是被其他表所引用的表。
8、where子句条件的连接顺序
Oracle采用自下而上顺序解析where子句,按照这个原理,表连接的条件必须写在其他条件之前,那些能过滤掉最大记录的条件必须写在where子句的末尾,也就是表在连接操作以前,能过滤的数据量越大越好。
Oracle sql 优化の常用方式的更多相关文章
- oracle sql 优化大全
转自: http://panshaobinsb.iteye.com/blog/1718233 http://yulimeander.blog.sohu.com/115850824.html 最近遇到了 ...
- Oracle SQL优化[转]
Oracle SQL优化 1. 选用适合的ORACLE优化器 ORACLE的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性) 设置缺省的优化 ...
- Oracle-01-数据库分类/oracle sql*plus常用命令
一.数据库分类 一.数据库分类1.小型数据库:access.foxbase2.中型数据库:informix.sql server.mysql3.大型数据库:sybase.db2.oracle 二.项目 ...
- Oracle SQL优化进阶学习
引言 对于下面的Oracle分页如何优化该段语句: SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM task_log order by ...
- Oracle SQL 优化原则(实用篇)
由于SQL优化优化起来比较复杂,并且还受环境限制,在开发过程中,写SQL必须遵循以下几点原则: 1.Oracle 采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他Where ...
- oracle sql优化
整理一下网上所看到sql优化方法 1.使用大写字母书写sql,因为oracle解释器会先将sql语句转换成大写后再解释 2 减少访问数据库的次数,多数情况下一条sql可以达到目的的,就不要使用多 ...
- Oracle SQL优化一(常见方法)
1.表访问方式优化: a)普通表优先“Index Lookup 索引扫描”,避免全表扫描 大多数场景下,通过“Index Lookup 索引扫描”要比“Full Table Scan (FTS) 全表 ...
- Oracle SQL优化器简介
目录 一.Oracle的优化器 1.1 优化器简介 1.2 SQL执行过程 二.优化器优化方式 2.1 优化器的优化方式 2.2 基于规则的优化器 2.3 基于成本的优化器 三.优化器优化模式 3.1 ...
- Oracle SQL优化原则
原文:http://bbs.landingbj.com/t-0-240353-1.html 1.选用适合的 ORACLE 优化器 2.访问 Table 的方式 3.共享SQL语句 共享的语句必须满足三 ...
随机推荐
- PR数量回写重复
- golang获取IP地址
ip:=this.Ctx.Request.RemoteAddr ip=ip[0:strings.LastIndex(ip, ":")]
- nat 类型及打洞原理
nat 类型分4种 1.全锥形 full cone A 与 主机B交互,nat转换 A的内部地址及端口为 ip1 port1,ip1和port1为对外地址,任何机器能访问. 2.ip 受限制(对B而 ...
- jquery 赋值时不触发change事件解决
$("#optionsId").change(function(){ $("#selectOptionsText").val('测试'); }); $(&quo ...
- UEdit百度富文本编辑器
1.下载地址:http://ueditor.baidu.com/website/download.html 2.引入js/css/语言包 3.表单id设置 3.js代码
- Laravel Nginx 站点配置文件(Homestead)
server { listen 80; listen 443 ssl http2; server_name fmtmis.local; root "/home ...
- c++11多线程学习笔记之二 mutex使用
// 1111111.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include ...
- htmlparser学习(原创)
--thumbelina.jar 这是一个演示图片搜索和显示的小程序JFrame Preferences.userNodeForPackage(getClass()); 根据传入的class所在包 ...
- cmd 命令阻塞继续执行下面的命令的办法
例如在dos下查询硬盘序列号: 首先输入:diskpart-->select disk 0--> detail disk. 如果要在java下面直接查询可以写成一个bat文件写成下面形式: ...
- samtools 工具
软件地址: http://www.htslib.org/ 功能三大版块 : Samtools Reading/writing/editing/indexing/viewing SAM/BAM/CRAM ...