ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:1.23MB ,
资源ID:7655918      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7655918.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(高级SQL优化一.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

高级SQL优化一.docx

1、高级SQL优化一高级SQL优化(一)SQL优化简介一般在应用中, 糟糕的SQL语句是造成系统性能低下的最主要原因,例如大小写的不统一、同样的SQL语句不同的写法等。而且,随着数据量的增加,情况会变得越来越严重。(题外话:优秀的Oracle数据库优化人才,是任何公司都稀缺的)SQL优化又称SQL调节,其步骤一般包括:SQL调节的目标SQL调节包括三大目标:降低负载、均衡负载和并行化负载。l降低负载:即寻找更高效的途径来完成相同的功能如某个非大表(小于2000万行数据数据或小于2G大小的单表),常规查询需要访问的数据实践中90%情况下是不会超过20%的,此时建立合理的索引是有效的方法之一l均衡负载

2、:即应该把任务分时段均衡调度如一般系统白天是访问高峰,如果此时备份任务、批处理任务或报表数据抽取任务也 挤在这个时段则易造成负载峰值现象,正确的做法应该是把备份任务、批处理任务和报表数据抽取任务放到晚上进行处理,或采用并行化策略l并行化负载:即大数据量的查询访问需要使用并发策略如在数据仓库环境中应该多使用并发策略,此举可以明显减少响应时间SQL优化阶段使用OEM发现顶级SQL在OEM中,选择性能-其它监视链接-定级活动,如下图:不要用*代替所有列名指定仅仅需要的列名与使用*对比:时间:359/1327=27.05% CUP耗费: 4092121327/6413227637=63.81%IO耗费

3、: 29601/110117=26.88% 可见大幅降低I/O从而降低响应时间!SQL优化技巧使用TRUNCATE代替DELETEOralce执行DELETE后会使用UNDO表空间存放被删除的信息以便恢复,如果之后用户使用ROLLBACK而不是COMMIT,则Oralce将利用该UNDO表空间中的数据进行恢复。当使用TRUNCATE时,Oracle不会将删除的数据放入UNDO表空间,因而速度要快很多。当要删除某个表中的全部数据时,应该使用TRUNCATE而不是不带WHERE条件的DELETE。语法如下:TRUNCATE TABLE table_name DROP|REUSE STORAGEDR

4、OP STORAGE为默认的方式,表示收回被删除的表空间REUSER STORAGE表示保留被删除的空间以供该表的新数据使用应用开发中,可以编写一个子程序让其动态的清除空表,以供调用。默认PCTFREE为10,假定为5,high-water mark是一个存储段分配多少存储器的标记。活用COMMITPL/SQL块中,经常将几个相互联系的DML语句写在BEGIN END,如果不影响事务的完整性,则建议在每个END前面写一个COMMIT,以达到 对DML的及时提交和 释放事务所占的资源的目的。COMMIT释放的资源包括:lUNDO段上用于恢复数据的信息l事物中DML语句获得的锁lSGA中重做日志缓

5、冲区中的空间lOracle为管理相关资源(如上述资源) 而开销的内部资源体验例子流程如下 :体验例子显示 :减少表的查询次数1.一个逻辑单元中,将能读出的列一次性读出,且尽量存放在本地变量中,应该杜绝不要用一个读一个2.在包含子查询的SQL中,要特别注意减少对表的查询次数,在代码清晰时对于能减少查询次数的应坚决减少,举例如下:3.执行计划如下,结论是什么?以EXISTS代替DISTINCT多表信息的查询时,避免在SELECT子句中使用DISTINCT. 一般可以考虑用EXISTS替换, EXISTS 使查询更为迅速,因为此时RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果。优化前:优

6、化后:使用默认值使用默认之后的执行时间比为1.063/2.657=40.01%,快了一倍多!可见在不含默认值,是null的列上没有使用索引,是全表扫描!而使用了默认值的列上使用了索引范围扫描!l不能用null作索引,任何包含null值的列都将不会被包含在索引中。即使索引有多列的情况下,只要这些列中有一列含有null,该列就会从索引中排除。也就是说如果某列存在空值,即使对该列建索引也不会提高性能l任何在where子句中使用is null或is not null的语句优化器是不允许使用索引的l如果每列确实可能存在空值的情况,可以使用默认值的方式替代以便充分利用索引提高性能使用DECODE函数减少处

7、理步骤l使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表.lDECODE函数也可以运用于GROUP BY 和ORDER BY子句中.l上述例子有两步相似的操作,使用DECODE后节省一半时间,如果一组相似的操作越多,节省的时间则越多,计算公式为n-1,其中n为相似操作的步骤数通配符的使用技巧上例中已知数据%DX_ACCOUNT_TRADE%,只有以I开头的 :0.031/1.891=1.639%l当通配符出现在LIKE后面字符串的首位时,索引将不会被使用,因此在已知某字符的情况下,LIKE查询中应尽量不要把通配符写在首位l%代表不定长的字符,_代表定长的字符,如果在确定要通配的字

8、符长度时,应该尽量使用_,而不是%定义并执行严格的SQL编写规范使用Oracle共享游标的优点是:l降低和减少Oracle对SQL的解析数量l动态调整内存l提高内存的使用率风格请参照前面章节中的“建议的程序风格”表的连接方式FROM表顺序选择使用基于规则的优化器(CBO)时,Oracle解析器按照从右到左的顺序处理FROM子句的表明,即FROM子句中最后的表(驱动表)会最先被处理。当FROM子句包含多个表时,建议将记录最少的表(一般是字典表)放在最后面。当Oracle处理多个表时,一般采用排序或合并的方式连接这些表,系统首先会扫描FROM子句部分的最后一个表,并对该表的数据行进行排序;然后扫描

9、倒数第二个表,并将从该表中取出的记录与第一个表中的记录进行匹配合并,依此类推。如果是大于两表相关联,最好选择交叉表为驱动表,交叉表是指被其它表所引用的表。RBO模式下,小表为驱动表的执行时间为大表是驱动的执行时间的:0.078/2.253 = 2.26%!驱动表的选择此时的优化器模式为CBO,二者的执行时间仅仅相差:0.328-0.313=0.015毫秒,二者几乎接近,这是为什么呢?我们再看二者执行计划:我们发现,此时二者的执行计划 一模一样!这又是为什么?驱动表的选择驱动表(Driving Table)是指被最先访问的表,通常是以全表扫描的方式访问的。如果优化器是CBO,则优化器会检查SQL

10、语句中每个表的物理大小、索引状态,然后寻找开销最小的执行路径。如果优化器是RBO,且所有连接条件都有索引对应,则驱动表是FROM子句中最后一个表。无论如何,我们建议始终将记录小的表(如字典表)作为驱动表,则能适应CBO和RBO!WHERE子句如何写Oralce优化器的原理是采用自下而上的顺序解析WHERE子句,因此表之间的连接必须写在其他WHERE条件之前, 可过滤掉最大数量记录的条件必须写在WHERE子句的末尾 。上述SQL语句的例子虽然符合优化规范的比不符合优化规范的写法仅仅快了不到0.4秒,但重要的是这是在当前单机环境、且没有任何其它数据库事务、业务很简单、连接的表仅有两个表的情况下。如

11、果在实际的大业务量环境下,则这种优化效应将成 倍数级增长!因此,我们建议任何时候编写SQL语句时要 使用表的别名、 对表的连接永远 写在WHERE后面的第一个位置,并对过滤条件进行估算, 按照降序的大小将这些 条件从WHERE子句最后部分往前排列。习题1.SQL优化的步骤包含那几步?可以使用那几种工具或方法发现糟糕的SQL?2.SQL调节的三大目标是什么?请举例来说明如何均衡负载。3.一般来说,SQL优化包括三个阶段,分别是语法分析、优化和执行阶段。请问,语法分析阶段的主要任务是什么?Oracle在优化阶段优化器主要执行的任务和考虑的因素又分别包含哪些?4.在SELECT少用*,多用具体的列名其理论依据是什么?5.Truncate包含几种用法?画图并解释Truncate如何改变高水位线。6.举例说明什么情况下应该尽量多用COMMIT,什么情况下不能。7.使用DECODE合并多个相类似操作,其与减少对数据库的查询次数有关系吗?8.应该避免那种不合适的通配符的使用方法?9.解释什么是驱动表,应该如何选择驱动表。10.推荐的FROM子句和WHERE子句应该如何写,并解释其原理。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1