热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

Oracle之sql语句优化

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

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

项目中虽然使用了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_gets<0.8 Order by 4 desc;

14、使用索引:

使用于查询的表,提供了主键的唯一性验证,long或者long raw数据类型,几乎可以索引所有列

定期重建索引,在删除和修改多的表,不适用索引,原因,不解释了。

注意,并不是创建了索引后就一定会走索引,使用索引的时候,不能使用索引进行一些计算,否则失效

使用索引快于全表扫描,在多表连接使用索引提高效率。

避免在索引上使用not:

会停止索引(not表示的是:没有什么, 而索引表示的是:有什么)

用exitsts替代distinct:

在提交一个包含一对多表信息(部门和雇员表)的查询时使用。原因:查找即返回原理

避免在索引列上使用计算:

低效:

Select * from dept where sal * 12 >25000

高效:

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索引扫描


推荐阅读
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 推荐一个ASP的内容管理框架(ASP Nuke)的优势和适用场景
    本文推荐了一个ASP的内容管理框架ASP Nuke,并介绍了其主要功能和特点。ASP Nuke支持文章新闻管理、投票、论坛等主要内容,并可以自定义模块。最新版本为0.8,虽然目前仍处于Alpha状态,但作者表示会继续更新完善。文章还分析了使用ASP的原因,包括ASP相对较小、易于部署和较简单等优势,适用于建立门户、网站的组织和小公司等场景。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
author-avatar
气质沫儿巛1314
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有