网站大量收购闲置独家精品文档,联系QQ:2885784924

Oracle语法效率优化应注意若干细节.docVIP

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Oracle语法效率优化应注意若干细节.doc

Oracle语法效率优化应注意的若干细节 一、尽量避免对列的操作 任何对列的操作都可能导致全表扫描,这里所谓的操作包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等式的右边,甚至去掉函数。 例:下列SQL条件语句中的列都建有恰当的索引,但30万行数据情况下执行速度却非常慢: select * from record where substrb(CardNo,1,4)=5378 select * from record where amount/30 1000 select * from record where to_char(ActionTime,yyyymmdd)由于where子句中对列的任何操作结果都是在SQL运行时逐行计算得到的,因此它不得不进行表扫描,而没有使用该列上面的索引;如果这些结果在查询编译时就能得到,那么就可以被SQL优化器优化,使用索引,避免表扫描,因此可将SQL修改如下: select * from record where CardNo like 5378% select * from record where amount 1000*30 select * from record where ActionTime= to_date ,yyyymmdd) 二、避免不必要的类型转换 尽量避免潜在的数据类型转换。如将字符型数据与数值型数据比较,ORACLE会自动将字符型用to_number()函数进行转换,从而导致全表扫描。 例:表tab1中的列col1是字符型(char),则以下语句存在类型转换: select col1,col2 from tab1 where col110 应该写为: select col1,col2 from tab1 where col110 三、增加查询的范围限制 增加查询的范围限制,避免全范围的搜索。 例:以下查询表record中时间ActionTime小于2015年5月1日的数据: select * from record where ActionTime to_date ,yyyymm) 查询计划表明,上面的查询对表进行全表扫描,如果我们知道表中的最早的数据为2011年1月1日,那么,可以增加一个最小时间,使查询在一个完整的范围之内。 修改如下: select * from record where ActionTime to_date ,yyyymm) and ActionTime to_date ,yyyymm) 此SQL语句将利用ActionTime字段上的索引,从而提高查询效率。同理,对于大于某个值的查询,如果知道当前可能的最大值,也可以在Where子句中加上 “AND 列名 MAX(最大值)”。 四、尽量去掉IN、OR 含有IN、OR的Where子句常会使用工作表,使索引失效;如果不产生大量重复值,可以考虑把子句拆开;拆开的子句中应该包含索引。 例4: select count(*) from stuff where id_no in(0,1)(23秒) 可以考虑将or子句分开: select count(*) from stuff where id_no=0 select count(*) from stuff where id_no=1 然后再做一个简单的加法,与原来的SQL语句相比,查询速度更快。 五、尽量去掉 尽量去掉 ,避免全表扫描,如果数据是枚举值,且取值范围固定,则修改为OR方式。 例: UPDATE SERVICEINFO SET STATE=0 WHERE STATE0; 以上语句由于其中包含了,执行计划中用了全表扫描(TABLE ACCESS FULL),没有用到state字段上的索引。实际应用中,由于业务逻辑的限制,字段state为枚举值,只能等于0,1或2,而且,值等于=1,2的很少,因此可以去掉,利用索引来提高效率。 修改为:UPDATE SERVICEINFO SET STATE=0 WHERE STATE = 1 OR STATE = 2 。进一步的修改可以参考第4种方法。 六、去掉Where子句中的IS NULL和IS NOT NULL Where字句中的IS NULL和IS NOT NULL将不会使用索引而是进行全表搜索,因此需要通过改变查询方式,分情况讨论等方法,去掉Where子句中的IS NULL和IS NOT NULL。 七、索引提高数据分布不均匀时查询效率 索引的选择性低,但数据的值分布差异很大时,仍然可以利用索引提高效率。 表serv_info中数据量很大,假设有一百万行,其中有一个字段Flag,

文档评论(0)

dmz158 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档