sql数据库论文
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
sql数据库论文
Oracle数据库SQL语句优化初探
摘要数学库的应用越来越多,数据查询使用较频繁,同时查询也加重了数据库的负荷,本文阐述sql查询的内部原理、oracle优化器及访问方式,通过对oracle数据库sql语句的优化提高数据库性能。
关键词Oracle;SQL;优化
随着网络信息技术的不断发展,数据库技术应用越来越广泛。数据库的调优工作涉及内容很广,从系统的规划、库表的设计、sql语句的编写、物理设备和网络设备的性能、内存和存储空间的分配等等都影响着系统的性能,通过优化,我们可以大大的提高系统运行效率和存储空间的利用率,达到用有限的资源实现一个高效的应用系统,因此,科学地构造数据库结构,合理使用查询语句及查询方法,是成功开发和应用数据库系统的重要环。本文将阐述sql查询的内部原理、oracle优化器及访问方式、oracle数据库sql优化原则。
1 Sql查询内部原理
查询在处理过程中分为4个阶段:将查询转换为内部格式阶段、将内部格式转换为规范格式阶段、为执行选择低层过程阶段、生成并选择最低的查询计划阶段。如图:
1.1阶段1:将查询转换为内部格式阶段
这一阶段主要是进行语法分析,将原查询转换为数据库内部格式,以便于机器处理,不符合语法规范的报错返回,为sql优化过程铺平道路。
1.2阶段2:将内部格式转换为规范格式
在这一阶段,数据库优化器将执行一系列“保证能够优化”的优化过程,是不会去考虑实际数据的值和数据库的存取路径;优化器将查询的内部表示转换为等价的规范格式。比如说将“A=B替换为B=A或者是p and q 替换为q and p”,这样做的目的是消除语句表面上的差异,以便能够找到一种在某些方面比原查询更为高效的表示方法。比如说能够将表达式(A JOIN B)WHERE restriction on A 转为等价高效的表达式(A WHERE restriction on A)JOIN B。
1.3阶段3:为执行选择低层过程
在这一阶段,优化器考虑的是索引、物理存取路径、数据值的分布、数据的物理聚集存储等问题。基本的策略就是将查询表达式看成一系列的“低层操作”,对于每一个可能的低层操作,都有一组可用的低层过程,而每一个低层过程都会有一个相关的代价计算公式(如磁盘
i/o代价,cpu利用率等)。
1.4阶段4:生成并选择最低代价的查询计划
这一阶段就是构造一组查询计划,选择一个最优,也就是代价最小的查询计划。因为每个计划都绑定一系列的低层过程,每一个过程对
应查询中的一个低层操作。优化器此时将所有的过程进行计算,选择一个代价最低的执行。
2 Oracle的优化器及表的访问方式
Oracle的优化器共有3种:RULE (基于规则)、COST (基于成本)、CHOOSE (选择性)。设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如
RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS。你当然也在SQL句级或是会话级对其进行覆盖。为了使用基于成本的优化器,必须经常运行analyze 命令,以增加数据库中的对象统计信息的准确性。如果数据库的优化器模式设置为选择性,那么实际的优化器模式将和是否运行过分析命令有关。如果表已经被分析过,优化器模式将自动成为CBO,反之,数据库将采用RULE形式的优化器。在缺省情况下,ORACLE采用CHOOSE优化器,为了避免那些不必要的全表扫描,必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器。
Oracle数据库访问Table的方式有两种:全表扫描和通过ROWID访问表。全表扫描就是顺序地访问表中每条记录。ORACLE 采用一次读入多个数据块的方式优化全表扫描。通过ROWID访问表,因ROWID包含了表中记录的物理位置信息,这样可以提高访问表的效率,同时ORACLE采用索引实现了数据和存放数据的物理位置
(ROWID)之间的联系, 通常索引提供了快速访问ROWID的方法,因此那些基于索引列的查询就可以得到性能上的提高。
3 SQL语句优化工作主要应该从6个面进行调整
一是去掉不必要的大型表的全表扫描;二是缓存小型表的全表扫描;三是检验优化索引的使用;四是检验优化的连接技术;五是尽可能减少执行计划的代价;六是共享SQL。
例如:在查询语句的使用中,尽量减少大型表的全表扫描,如果使用大型表的全表扫描会极大地加重数据库的负载,降低数据库的运行性能,同时合理使用索引技术,不要使用in、not in、<>、IS NULL等操作符,这些操作将不会使用索引,并引起数据库会进行全表扫描;注重多表查询的连接技术,缓存小型表的全表扫描,可以通过将小型表置入缓冲区高速缓存的KEEP池中实现,ORACLE的这个功能可以大大地提高SQL的执行性能并节省内存的使用;尽可能使SQL共享,在实际操作中注意SQL语句的一致性,提高SQL语句的“命中率”,因为提高SQL共享程度可以不重复解析相同的SQL语句,在第一次解析之后,ORACLE将SQL语句存放在内存中,这块位于系统全局区域SGA 的共享池中的内存可以被所有的数据库用户共享,因此,当你执行一个SQL语句(比如游标)时,如果它和之前的执行过的语句完全相
同,ORACLE就能很快获得已经被解析的语句以及最好的执行路径。
在大型数据库的应用中,查询是一个非常重要又使用频繁的操作,因而查询SQL的编写技巧将极大地影响数据库的性能,以上的6个方
面仅反映了SQL优化的一些应用技术,在实际工作中还有更多领域需要进一步研究与探讨,如SQL查询的授权与分级操作等,以更进一步提高数据库性能。
参考文献
[1]John Carnell,等著.Oracle 8i 应用高级编程-java,PL/SQL和XML深入开发.清华大学出版社.
[2]Rama Velpuri,等著.新版Oracle8故障解决手册.机械工业出版社.