一.一般SQL技巧
SQL语句得调整
1.建议不用'*'来代替所有列名
用'*'来代替所有列,会出现解析得动态问题,Oracle系统先要查询数据字典将'*'转换成该表得所有列名
2.用truncate代替delete
在采用delete进行删除表时,Oracle9或10会使用撤销表空间来存放恢复得信息,如果用户没有发出commit语句,而是发出rollback语句,oracle系统会
将数据恢复到删除前得状态.但使用truncate对表删除,系统不会将被删除得数据写如回滚段.
3.在确保完整性得情况下多用commit语句
PL/SQL中,经常将多个DML语句写在一个Begin..End块中,建议在每个块得End前使用commit语句,这样可实现对象DML数据得及时提交,同时也释放了资源.
4,尽量减少表得查询次数
在含子查询得SQL语句中,要特别注意减少对表得查询.
在执行子查询时,如果对子表查询了多次,应考虑将多各子查询合并成一个子查询.
5.用not exits代替not in
在子查询中,not in 子句将执行一个内部得排序和合并.无论在哪中情况,not in都时最低效得,因为它对子查询中得表执行了一个全表遍历.为了避免使用not in,我们可以把它改成外连接或使用not exists子句.
例:
select ... from emp where dept_no not in (select dept_no from dept where dept_cat='A');
可换成:
select ... from emp a,empt b where a.dept_no = b.dept(+) and b.dept_no is null and b.dept_cat(+)='A';
用not exists子句代替,效率最高
select ... from emp e where not exists (select 'X' from dept d where d.dept_no=e.dept_no and dept_cat='A';
6.用exists代替in
在许多基于驱动表得查询中,为了满足一个条件,往往需要对另一个表进行连接.在这种情况下,使用exists通常提高查询得效率.
in得例子:
select * from emp where empno>0 and deptno in (select deptno from dept where loc='melb');
用exists高效
select * from emp where empno>0 and exists (select 'x' from dept where dept.detpno = emp.deptno and loc='melb');
7.用exists代替distinct
当提交一个包含一对多表信息得查询时,避免在select子句中使用distinct.一般可考虑用existis代替.
用distanct
select distinct d.department_id,d.department_name from departments d,employees e where d.department_id=e.department_id;
用exists效率更高
select d.department_id,d.department_name from departments d where exists (select 'x' from employees e where
e.department_id=d.department_id);
二.表得连接方法
1.选择FORM表得顺序
在基于规则得优化器中,Oracle得解析器按照从右到左得顺序处理FROM子句中得表名,因此FROM子句中写在最后得表(驱动表)将被最先处理.在FROM子句中包含多个表得情况下,建议选择记录条数最少得作为驱动表.当Oracle处理多个表时,会运用排序及合并得方式连接它们.首先,系统扫描FROM子句中最后得表,并对该表得数据行进行排序,然后扫描第二张表,最后将所有从第二个表中检索出得记录与第一张表中得合并.
2.驱动表得选择
驱动表是指最先访问得表(通常以全表扫描得方式被访问).根据优化器得不同,SQL语句中驱动表得选择是不一样得;如果使用得是基于成本CBO(COST BASEDOPTIMIZER),优化器会检查SQL语句中得每个表得物理大小,索引得状态,然后选用花费最低得执行路径.如果用基于规则RBO(RULE BASED OPTIMIZER),并且所有得连接条件都有索引对应,在这种情况下,驱动表就是FROM子句中列在最后得那个表.
3.where子句的连接顺序
Oracle采用从左到右的顺序解析where子句,根据这个原理,表之间的连接必须写在其他where条件之前;那些可以过滤掉最大数量记录的条件必须写在where子句的末尾.
三.有效使用索引
1.何时使用索引
在利用索引的情况下,由于只从表中选择部分行,所以能提高查询的速度.对于只从总行数查询2%~4%的表,可以考虑创建索引.下面是创建索引的基本原则:
a.对于经常以查询关键字为基础的表,并且该表中的行遵从均匀分布的;
b.以查询关键字为基础,表中的行随机排序;
c.包含的列数相对比较少的表
d.表中的大多数查询都包含相对简单的where子句
e.缓存命中率较低,并且不需要操作系统缓存
2.索引列和表达式的选择
在创建索引时,选择列和表达式是非常重要的,下面是创建索引时选择索引列的原则
a.where从句频繁使用关键字
b.SQL语句中频繁用于进行表连接的关键字
c.可选择性高(重复性少)的关键字
d.对于取值较少的关键字或表达式,不要采用标准的B+数索引,可考虑建立位图索引
e.不要使用包含函数或操作符的where子句中的关键字作为索引列,如果存在这样的需要的话,可以考虑建立函数索引
f.如果大量的并发insert,update,delete语句访问父表或子表,则考虑使用完整性约束的外部键作为索引
g.在选择索引列时,还要考虑该索引所引起的inset,update,delete操作是否值得.
选择复合索引主列
多列索引叫复合索引,复合索引有时比单列索引有更好得性能.如果在建立索引时采用了几个列作为索引,则在使用时也要按照建立时得顺序来描述,也就是说,主列是最先被选则得列.
例:创建一个复合索引(x,y,z)和查询语句中得where子句得使用顺序问题.
Create index comp_id on table1(x,y,z);
使用复合索引是必须使用where…and
select * from table1 where x=c1 and y=c2 and z=c3;
错误得写法
select * from table1where y=c2 and x=c1 and z=c3;(必须要按照建立索引时得顺序)
选择复合索引时须遵从得规则:
a. 应选择在where子句条件中频繁使用得关键字,且这些关键字由AND操作符连接;
b. 如果几个查询都选择相同得关键集合,则考虑创建组合索引
c. 创建索引后使得where从句所使用得关键字能够组成前导部分
d. 如果某些关键字在where子句中得使用频率较高,则考虑创建索引
e. 如果某些关键字在where从句中使用频率相当,则创建索引时考虑按照从高到低得顺序来说明关键字
避免对大表得全表扫描
一般应该避免对大表进行全表扫描,全表扫描指不加任何条件或没有索引得查询语句.
下面情况下,Oracle就可以使用全表扫描
a. 所查询得表没有索引
b. 需要返回所有得行
c. 带like并使用’%’这样得语句就是全表扫描
d. 对索引主列有条件限制,但是使用了函数,则Oracle使用全表扫描
where upper(city)=’TOKYO’;
e.带有is null和is not null及!=等子句也导致全表扫描
分享到:
相关推荐
书写高质量的oracle sql,用表连接替换EXISTS,索引的技巧等等
Oracle SQL 是一种强大的数据库查询和编程语言,广泛用于管理和操作Oracle数据库系统。...在实践中,掌握PL/SQL的编程技巧,结合SQL的强大力量,可以实现更高效的数据管理、数据分析和应用程序开发。
Oracle SQL 优化技巧 Oracle SQL 优化是提高数据库性能的关键技巧之一。以下是 Oracle SQL 优化的 12 个技巧: 1. 选择最有效率的表名顺序 在基于规则的优化器中,Oracle 的解析器按照从右到左的顺序处理 FROM ...
Oracle SQL Developer 是一款由Oracle公司推出的强大的数据库管理工具,它为数据库管理员(DBA)、开发者以及数据分析师提供了全面的功能,以高效地管理和操作Oracle数据库。本文档将深入讲解Oracle SQL Developer的...
### Oracle SQL性能优化技巧总结 #### 一、选择最有效率的表名顺序 在Oracle数据库中,SQL语句的执行顺序对查询性能有着显著的影响。对于基于规则的优化器而言,FROM子句中表的顺序至关重要。Oracle的解析器会按照...
10. **性能调优**: 提供了针对Oracle SQL查询和整个数据库系统的性能优化技巧。 ### 关键知识点详解 #### SQL基础 - **DDL(数据定义语言)**: 用于创建和修改数据库结构(如表、视图等)的SQL语句。 - **DML...
这本书旨在帮助读者掌握Oracle SQL的高级技巧,提升在数据库管理和数据分析方面的技能。 Oracle SQL是Oracle数据库系统中的结构化查询语言,它是对数据库进行操作的基础工具,包括数据查询、数据插入、更新和删除等...
### Oracle SQL*Plus 口袋...以上章节覆盖了《Oracle SQL*Plus Pocket Reference, 2nd Edition》的主要内容,为读者提供了丰富的SQL*Plus使用技巧和最佳实践,适合各种级别的Oracle数据库管理员和技术人员学习和参考。
所涵盖的内容涉及SQL核心、SQL执行、分析函数、联结、测试与质量保证等,并提供大量实用性建议,且总结出方方面面的“技巧”帮助读者在阅读过程中快速消化所看内容。 《Oracle SQL高级编程/数据库系列》适合软件研发...
### Oracle SQL性能优化技巧大总结 #### 一、选择最有效率的表名顺序 **背景**:在基于规则的优化器(RBO)中,Oracle解析器处理FROM子句中的表名是从右向左的。为了提高查询效率,需要合理安排表的顺序。 **技巧...
只有通过深入学习 SQL 语法及各种 SQL 调优技巧,熟悉 SQL 语法、掌握各种内嵌函数、分析函数的用法,才能编写高效的 SQL。 SQL 优化是一个系统工程,需要从多方面来考虑,包括应用程序级调优、实例级调优和操作...
这些文档可能按章节划分,从基础概念到高级技巧,逐步深入,帮助你成为一个熟练的Oracle SQL用户。记住,理论学习之余,实践操作同样重要,结合实际的数据库环境进行练习将有助于巩固和提升你的技能。
- 书名中的“Pro”暗示了书籍内容针对的是对Oracle SQL有一定了解的中级到高级用户,意在使读者能够掌握更高级的技巧。 4. 关于Oracle SQL的进阶主题可能包括: - SQL性能优化,如如何编写高效的查询,如何使用...
目标是为读者提供一套全面的Oracle SQL知识体系,包括基础概念、高级查询技巧、最佳实践和问题解决策略。通过学习本书,读者将能够熟练掌握Oracle SQL的核心概念,如数据定义语言(DDL)、数据操纵语言(DML)、聚合...
综上所述,《精通Oracle SQL(第2版)》是一本全面覆盖Oracle SQL的指南,它既适合初学者入门,也适合有经验的开发者提升技能,通过深入学习,读者可以熟练掌握Oracle数据库的管理和开发技巧,提升在大数据环境下的...
以下是一些关于Oracle常用SQL技巧的经典要点: 1. **避免在SELECT子句中使用“*”**:在SQL查询中,使用通配符“*”代表选择所有列,虽然方便但效率低下。Oracle在解析时需要查询数据字典获取所有列名,增加了额外...
接下来,将详细介绍Oracle SQL的一些基础知识点以及应用这些知识进行实战的策略和技巧。 Oracle SQL基础知识点主要包括以下几个方面: 1. SQL语言概述:结构化查询语言(SQL)是一种用于管理和操作关系数据库的...
Oracle SQL 是 Oracle 数据库的核心组成部分之一,它不仅支持标准 SQL 语法,还包含了许多高级功能和优化技巧。熟练掌握 Oracle SQL 可以帮助开发者更有效地管理和利用数据库资源。通过实践上述示例和技巧,您可以更...