当前位置:  数据库>oracle

Oracle之sql语句优化

    来源: 互联网  发布时间:2017-06-09

    本文导语: 项目中虽然使用了orm映射,但Oracle系统的优化还是很有价值的,这里从sql语句的角度对常用的语句做下总结。 1、from字段中的优化: Oracle安照从右到左的顺序加载表数据,应该把可以排除数据最多的表放到后面(基础表)。 比...

项目中虽然使用了orm映射,但Oracle系统的优化还是很有价值的,这里从sql语句的角度对常用的语句做下总结。

1、from字段中的优化:

Oracle安照从右到左的顺序加载表数据,应该把可以排除数据最多的表放到后面(基础表)。

比如,在关联查询中,把课程表放到后面,成绩表放到前面,因为课程表数据一般比较少,关联的时候可以快速的过滤掉一些成绩数据。

2、where中的优化:

对可以过滤数据最多的,放到后面,原理也是Oracle执行从下到上(从右到左)的顺序。

3、使用列名替代*:

省去从字典表中解析的过程 :

Oracle执行sql语句过程:

在共享池中搜索sql语句是否已经存在

验证sql是否语法精确

执行数据字典验证表和列的定义

获取对象的分析锁,以便在语句的分析过程中对象的定义不会改变

检查用户是否具有相应的操作权限

确定语句最佳执行计划

将语句和执行方案保存到共享的sql区。

4、使用?参数形式:

尽量不要使用拼接字串的方式,因为带有?的参数形式会缓存分析结果,省去上面很多步骤。

5、使用decode函数:

decode不会重复扫描相同记录或重复连接相同的表,减少表的扫描次数。

6、使用truncate替代delete:

delete:逐条删除,并保存回滚还原点。DML(数据操作语言insert,update,delete,merge)

truncate不会保存回滚点,是DDL(数据定义语言,如drop,alter)

在oracle里DML是可以rollback的,而DDL是不可以的

如果数据量大,差别很大的。

7、尽量多用commit:

Oracle只有在commit后才会提交(区别于sqlserver),如果没有提交,会在内存中保存很多数据。commit后释放的资源有:

回滚上段用于恢复数据库的记录信息

被程序语句获得的锁

Redo log buffer中的空间

为管理上述3种资源的内部花费

8、使用where语句替代having子句:

在分组或者配合group的时候会使用having。

where会直接过滤掉数据,使用having往往会配合group,检索出数据后,会带着数据进行排序、统计等。

9、on/where/having排序使用顺序:

on:做的是数据映射,在映射时,把没用的数据直接过滤掉了

where:先进行一个全表的搜索,之后再进行数据筛选

where又比having要快,having中带的垃圾数据同样也做了运算

10、减少对表的查询:

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

Select tab_name from tables where (tab_name,db_ver)=(select tab_name,db_ver from tab_columns where version=604)

11、使用表别名:

减少对sql语句解析的时间并减少由多个表相同的Column名歧义引起的语法错误

如果不使用别名,会去字典表中查找,判断是否有列名歧义。

12、使用exists替代in not exists替代not in:

Oracle采用命中即返回的方式,在多表链接查询时,如果使用in会导致子查询的表全表遍历,并排序、合并,这时候可以使用外链接或not  exists 替代。

13、识别低效率执行的语句:

各种sql优化的图形工具层出不穷,但可以写出自己的sql工具来解决问题

Select executions, disk_reads, buffer_gets, round((buffer_gets-disk_reads)/buffer_gets,2) hit_radio,Round(disk_reads/executions,2) reads_per_run,Sql_text From V$sqlarea Where executions>0 and buffer_gets>0 And (buffer_gets-disk_reads)/buffer_gets25000

高效:

Select * from dept where sal> 25000/12

避免在索引列上使用is null 和 is not null:

因为索引不会对null数据类型进行索引,索引只是记录有什么

对于单列索引,不会进行索引

对于符合索引,如果所有列多为空,不进行索引,只要有一个列不空,就索引。

在Oracle中空不等于空,所以,就会插入若干条相同键值的记录,而他们的值都是空,而空值不进行索引,所以,当进行空值比较时,会使用Oracle,停止使用该索引。

低效:

Select …. From dep where dep_code is not null;

高效:

Select …. From dep where dep_code >=0;这里也会过滤掉null列

总是使用索引的第一个列:

如果索引建立在多个列上,只有咋他的第一个列,被where自居引用时,优化器才会选择使用该索引,当仅使用索引的第二个列是,优化器会忽略索引,使用全表索引。

15、>=是直接定位:

如果使用 >还需要一个判断的过程。

16、使用union替代where字句中的or:

对索引列使用or会导致全表扫描,针对多个索引列有效

17、在oracle8i下,两者执行路径似乎相同,但能用in的就别用or。

18、使用union-all:

union-all:不排序,查询所有的,不过滤重复的

nuion:排序(优化sort_raea_size这块内存),过滤重复的。

19、order by 用where 限定:

order by名中索引的条件比较苛刻

排序列必须包含在相同的索引中,并保持索引中的排列顺序,Order by中所有列不能定义为空。

20、需要当心的where子句:

!=将不使用索引

||字符连接函数,会停用索引

+ - *  /  会停用索引

相同的索引列不能互相比较,否则会启用全表扫描

21、使用大写:

Oracle中会把所有的语句转换成大写,

有些内部表,如,查询表名时,判断某个表是否存在,如果是大写有效,小写就是无效的

22、根据磁盘读写速率调整块的大小:

一个Oracle数据库中,表空间、段、区、数据块的概念,可以根据服务器的I/O性能调整块的大小。

总结:

上面的点分的很细,他们都是根据Oracle的内部原理总结出的常用规律,所以,掌握原理要比记住这些跳跳框架更加重要,常用的规则有:

Oracle按照从右到左,从下至上、由外到内的执行顺序

在检索数据的时候,往往遵循查到即返回的原则

索引,记录的是有哪些数据,所以,不要在索引列上直接使用排除不存在条件的查询,也不要在索引上进行计算

Oracle认为空不等于空

where命中索引的几率比较高,通常情况下,优先选择使用where。

由Oracle索引来理解ArcSDE索引

Oracle索引技术之如何建立最佳索引

Oracle索引列NULL值引发执行计划该表的测试示例

Oracle索引 主键影响查询速度

Oracle索引扫描


    
 
 

您可能感兴趣的文章:

  • oracle导出sql语句的结果集和保存执行的sql语句(深入分析)
  • oracle用什么SQL语句判断表存不存在
  • 请问怎么用jsp语句删除oracle中的一条记录?
  • Oracle中SQL语句连接字符串的符号使用介绍
  • Oracle用什么语句查询字段?
  • 怎么在java中向一个sql语句传参数,就像oracle的proc一样啊?
  • 请问在 Linux 下如何用代码实现连接oracle数据库 并 执行 SQL 语句?
  • Oracle 9i轻松取得建表和索引的DDL语句
  • Oracle的SQL语句中如何处理‘&’符号
  • 关于Oracle中的sql语句的疑问,向大家请教。
  • Oracle Sql语句长度限制问题及解决
  • Oracle9i取得建表和索引的DDL语句
  • Oracle 中文字段进行排序的sql语句
  • oracle数据库添加或删除一列的sql语句
  • Oracle中查询本月星期5的所有日期列表的语句
  • Oracle中备份表的简单sql命令语句
  • oracle中误删除表后恢复语句(FLASHBACK)
  • Oracle判断指定列是否全部为数字的sql语句
  • jsp中在oracle中查询日期类型时sql语句该怎么写啊?
  • Oracle 常用的SQL语句
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 取数据库前几条数据(sql server、oracle、mysql)的sql写法
  • Oracle发布Oracle SQL Developer 1.2数据库开发工具 帮助用户简化开发工作
  • 与jsp搭配,oracle好?sql server好?
  • Oracle开发工具 Oracle SQL Handler
  • Oracle与SQL Server区别在哪里
  • oracle sql执行过程(流程图)
  • 怎么写一个Shell来执行这样的功能,访问Oracle数据库,然后执行一个SQL脚本,生成一个文件。急!
  • Oracle捕获问题SQL解决CPU过渡消耗
  • Unix系统下oracle sql排版
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • c/c++ iis7站长之家
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍
  • SCO unix下安装oracle,但没有光盘,请大家推荐一个oracle下载站点(unix版本的)。谢谢!!!!
  • oracle中如何把表中具有相同值列的多行数据合并成一行
  • 请问大家用oracle数据库, 用import oracle.*;下的东西么? 还是用标准库?
  • Oracle 数据库(oracle Database)性能调优技术详解
  • Linux /$ORACLE_HOME $ORACLE_HOME
  • ORACLE日期相关操作
  • Linux系统下Oracle的启动与Oracle监听的启动
  • ORACLE数据库常用字段数据类型介绍
  • 请问在solaris下安装ORACLE,用root用户和用oracle用户安装有什么区别么?
  • Oracle 12c的九大最新技术特性介绍
  • 网间Oracle的连接,远程连接Oracle服务器??
  • ORACLE中DBMS_RANDOM随机数生成包
  • 请教:.profile中:if [ -d /opt/oracle/db01/app/oracle/product/9.2.0 ]是什么意思?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,