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语句 共享的语句必须满足三 ...
随机推荐
- 新手C#SQLServer在程序里实现语句的学习2018.08.12
从C#中连接到SQL Server数据库,再通过C#编程实现SQL数据库的增删改查. ado.net提供了丰富的数据库操作,这些操作可以分为三个步骤: 第一,使用SqlConnection对象连接数据 ...
- java 元数据
什么是元数据? 元数据是指用来描述数据的数据,更通俗一点,就是描述代码间关系,或者代码与其他资源(例如数据库表)之间内在联系的数据.在一些技术框架,如struts.EJB.hibernate就不知不觉 ...
- linux 随笔
LINUX环境下的批处理文件的扩展名是.sh,而在windows环境的批处理文件名是.bat
- update from
update table1 set table1.column1 =(select table2.column1 from table2 where 关联条件) where exists(selec ...
- css:多个div在同一行显示
使用float:left,也可以使用display : inline-block,可以使多个div在同一行显示. 示例如下: <div class="search_row"& ...
- java内存模型:Happens-Before
有序性:Java内存模型中的程序天然有序性可以总结为一句话:如果在本线程内观察,所有操作都是有序的:如果在一个线程中观察另一个线程,所有操作都是无序的.前半句是指“线程内表现为串行语义”,后半句是指“ ...
- 第八章 高级搜索树 (a1)伸展树:逐层伸展
- pairs
pairs http://acm.hdu.edu.cn/showproblem.php?pid=5178 Time Limit: 2000/1000 MS (Java/Others) Memor ...
- Linked dylibs built for GC-only but object files built for retain/release for architecture x86_64
编译开源Xcode 插件 SCXcodeSwitchExpander 源码地址: https://github.com/stefanceriu/SCXcodeSwitchExpander 编译环境:X ...
- OC -网络请求 - NSURLConnection - POST
#import "ViewController.h" @interface ViewController () @end @implementation ViewControlle ...