1. 常规SQL语句优化

1.1 建议不用“*”来代替所有列名

SELECT语句中可以用“*“来列出某个表的所有列名,但是这样的写法对Oracle系统来说会存在解析的动态问题。Oracle系统会通过查询数据字典来将”*“转换成表的所有列      名,这自然会消耗系统时间。

1.2 用TRUNCATE代替DELETE  

当使用DELETE删除表中的数据行时,Oracle会使用撤消表空间(UNDO tablespace)来存放恢复信息。而TRUNCATE则不会。语法:

truncate [table|cluster] schema.[tale_name][cluster_name][drop|reuse storage]

创建一存储过程,实现使用truncate命令动态删除数据表:

create or replace procedure trun_table(table_deleted in varchar2) as --实现清空指定的表的存储过程
cur_name integer; --存储打开的游标
begin
cur_name := dbms_sql.open_cursor; --打开游标
dbms_sql.parse(cur_name,'truncate table '||table_deleted||' drop storage',
dbms_sql.native); --执行truncate table table_deleted命令
dbms_sql.close_cursor(cur_name); --关闭游标
exception
when others then
dbms_sql.close_cursor(cur_name); --异常时...
raise;
end trun_table;
/

1.3 在确保完整性的情况下多用COMMIT语句

在PL/SQL块中,经常将几个相互联系的DML语句写在一个BEGIN...END块中,建议在每个块的END前面使用COMMIT语句,这样就可以实现对象DML语句的及时提交,同时也释放事务所占用的资源。

1.4 尽量减少表的查询次数

在含有子查询的SQL语句中,要特别注意减少对表的查询。

1.5 用[NOT] EXISTS代替[NOT] IN

在子查询中,[NOT] IN子句将执行一个内部的排序与合并,无论在哪种买号上,[NOT] IN都是最低效的,因为它对子查询中的表执行了一个全表遍历。为了避免使用[NOT] IN,我们可以把它改成外连接(outer joins)、[NOT] EXISTS子句,如下面的两段代码:

第一种,低效率的NOT IN子句:

select empno,ename from emp
where empno not in(select deptno from dept where loc='BEIJING');

第二种,高效率的EXIST子句:

select empno,ename from emp
where exists(select deptno from dept where loc='BEIJING');

当[NOT] IN后面跟子查询,并且查询的结果集较多时,不宜使用[NOT] IN;但如果[NOT] IN后面的括号内是列表(可枚举的几个)或子查询所满足结果集较少时,也是可以使用的。

2. 表连接优化

2.1 驱动表的选择

驱动表(Driving Table)是指被最先访问的表(通常以全表扫描的方式被访问)。示范:

select s.name,d.dept_name from department d,students s
where d.dept_no=s.dept_no;

假设在STUDENTS表的DEPT_NO列创建了索引,而在DEPARTMENT表的DEPT_NO列没有索引。由于DEPARTMENT最先被访问(紧随FROM其后),这样DEPARTMENT表将被作为查询中的驱动表。需要对两张表都建立索引,否则影响效率。

2.2 WHERE子句的连接顺序

Oracle采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可买过滤些最大数据记录的条件必须写的WHERE子句的末尾,也就是在表进行连接操作以前,过滤掉的记录数据越多越好。

3. 合理使用索引

3.1 索引列和表达式的选择

  • 对于取值较少的关键字或表达式,不要采用标准的B树索引,可以考虑建立位图索引。
  • 不要将那些频繁修改的列作为索引列。
  • 在选择索引列时,还要考虑该索引所引起的INSERT、UPDATE、DELETE操作是否值得。

3.2 使用复合索引

create index complex_index on tb_test(column1,column2,column3);

这里的索引是一个复合索引,它包含三列,在查询语句中要带有WHERE...AND从句才能使用该复合索引。

3.3 避免全表扫描大表

以下情况下Oracle会使用全表扫描:

  • 所查询的表没有索引;
  • 需要返回所有的行;
  • 带like并使用”%“这样的语句就是全表扫描;
  • 对索引主列有条件限制,但使用了函数,则Oracle使用全表扫描;
  • 带有is null、is not null或!=等字句也导致全表扫描。比如:
    select * from emp where job != 'MANAGER';

Oracle学习笔记之八(几条简明的优化SQL方法)的更多相关文章

  1. Oracle 学习笔记(Windows 环境下安装 + PL/SQL)

    Oracle 安装.PL/SQL 配置使用  前言:因更换机械硬盘为 SSD 固态硬盘装了新 Windows 7 系统,需要重新搭建开发环境,把 Oracle 安装过程和 PL/SQL 配置使用做下笔 ...

  2. Oracle 学习笔记 19 -- 触发器和包浅析(PL/SQL)

    触发器是存放在数据库中的一种特殊类型的子程序.不能被用户直接调用,而是当特定事件或操作发生时由系统自己主动 调用执行.触发器不能接受參数.所以执行触发器就叫做触发或点火.Oracle事件指的是数据库的 ...

  3. Oracle 学习笔记 18 -- 存储函数和存储过程(PL/SQL子程序)

    PL/SQL子程序 它包含了函数和过程.此功能是指用户定义的函数.和系统功能是不同的.子程序通常完成特定的功能PL/SQL座.,能够被不同的应用程序多次调用.Oracle提供能够把PL/SQL程序存储 ...

  4. oracle学习笔记第一天

    oracle学习笔记第一天 --oracle学习的第一天 --一.几个基础的关键字   1.select select (挑选) 挑选出显示的--列--(可以多列,用“,”隔开,*表示所有列),为一条 ...

  5. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  6. Oracle学习笔记——点滴汇总

    Oracle学习笔记——点滴汇总 http://www.botangdb.com/ Oracle GI = Grid Infrastructure = ASM + Cluster

  7. Oracle学习笔记之四sp1,Oracle 11g的常用函数

    从Oracle学习笔记之四,SQL语言入门中摘出来的,独立成一章节 3.1 字符类函数 ASCII(c)和CHR(i)    分别用于返回一个字符的ASCII码和返回给定ASCII值所对应的字符. C ...

  8. Oracle学习笔记之四,SQL语言入门

    1. SQL语言概述 1.1 SQL语言特点 集合性,SQL可以的高层的数据结构上进行工作,工作时不是单条地处理记录,而对数据进行成组的处理. 统一性,操作任务主要包括:查询数据:插入.修改和删除数据 ...

  9. Oracle学习笔记—数据字典和常用命令(转载)

    转载自: oracle常用数据字典和SQL语句总结 Oracle常用命令大全(很有用,做笔记) 一.Oracle数据字典 数据字典是Oracle存放有关数据库信息的地方,其用途是用来描述数据的.比如一 ...

随机推荐

  1. rapidxml 解析修改内存的值

    1.使用rapidxml解析的时候,也就是 调用xmlDoc.parse<0>(xmlContent),特别注意,rapidxml会修改内存的值,把右尖括号>修改为'\0',因此特别 ...

  2. NodeBB,一个基于nodejs的响应式论坛

    喜欢方便的同学请绕道去discuz,好吧我是nodejs的重视患者,首先你要有自己的vps或则云空间,比如9cloud,我今天用的是阿里云的VPS. 进入阿里云Ubuntu主机 .... 输入密码进入 ...

  3. iOS用户体验之-导航之道

    iOS用户体验之-导航之道 用户不会意识到有导航指向的存在除非他遇到非预期的效果. 能够说导航时逻辑跳转的节点.所以导航对用户体验是至关重要的. iOS中有三种类型的导航.每一种适合不同类型的app. ...

  4. oracle connect nocycle

    select * from uc_staff_department_level t,uc_t_staff stwhere st.id=t.staff_idand t.department_id in ...

  5. 【.NET中AOP的实现方案】静态代理

    Spring AOP 应该是比较出名的了,今天说的是C#里的AOP,C#的AOP实现的方式有很多种,现在就先介绍静态代理的实现方案: 模拟场景:我们在删除用户,或者更新用户的时候进行数据原始备份,这样 ...

  6. 【CSS】瀑布流布局的两种方式:传统多列浮动和绝对定位布局

    传统多列浮动 各列固定宽度,并且左浮动: 一列中的数据块为一组,列中的每个数据块依次排列即可: 更多数据加载时,需要分别插入到不同的列上: 优点: (1)布局简单,应该说没啥特别的难点: (2)不用明 ...

  7. Linux获得命令帮助(学习笔记五)

    一.获得命令帮助 1.1.内部命令与外部命令 简单来说,在linux系统中有存储位置的命令为外部命令: 没有存储位置的为内部命令,可以理解为内部命令嵌入在linux的shell中,所以看不到. typ ...

  8. EL运算符(web基础学习笔记十七)

    一.EL语法 1.1.语法结构 ${expression} 1.2.[]与.运算符 EL 提供.和[]两种运算符来存取数据. 当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一 ...

  9. 笔试题之java基础

    Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io 的语法,虚拟机方面的语法,其他.有些题来自网上搜集整理,有些题来自传智 ...

  10. Unity 添加自定义菜单(插件),添加功能

    网上介绍如何写这种插件的文章很多...但是对于新手来说,最基本的,怎么运行这个插件,都不知道...网上的文章都懒得说这个...   幸好,看了半天官方网站别的资料,突然就发现办法了...   这个不是 ...