点击上方“蓝字”可以关注我们哦 |转载自:DBAplus社群 |原文链接:http://mp.weixin.qq.com/s/V_UReU0dp13jp4Ze70NMrA 本文作者通过身边的案例,详细阐述了SQL优化过程中的种种方法和小窍门,内容丰富且言之有物,希望能让接触到SQL的同学可以体会到SQL提速的乐趣! 1.前言 关于SQL优化,前辈们、技术大咖们、各个技术论坛上早就有很多的优秀文章,今番我再次提起,心情忐忑,实在是有些班门弄斧和自不量力了。 在大家的鼓励下我想写一下也好,就写我们身边的事,用身边的案例来演绎SQL优化,用形象语言把SQL优化说成我们身边的事,希望能让接触到SQL的同学可以体会到SQL提速的乐趣! 2.理解几个名词 提到SQL优化,我们不得不学习几个名词,这就好比武侠小说里练习武功一样,不知道几个穴道,不了解几个气门都不好意思提自己是练功夫的。名词挺多,除了这里提到的还有好多,比如内外连接、嵌套循环、游标共享、绑定变量、软硬解析等等,武功太多,练不过来,那我们先把马步扎好再说。没有提到的功夫在藏经阁都有,请按需百度。 2.1 执行计划 执行计划是什么呢?就是SQL执行的路径和执行步骤。怎么理解呢?你从家里到公司可以选择开车走高速,也可以选择做公交车走市区街道,那么你选择用哪个交通工具,走哪个路线,就是你的执行计划。但是一次只能有一个方案。 一个SQL生成了执行计划,他就会被固定到共享池里,只有在表发生了变更、统计信息过旧、共享池被刷新、数据库重启等情况下SQL才会重新生成执行计划。还是从家到公司,城市在修路,公交路线变化都会影响你选择什么样的方式上班。 2.2 索引 索引是一个单独的、物理的数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。怎么理解呢?表是一本书,索引就是这本书的目录。 2.3 统计信息 统计信息主要是描述数据库中表,索引的大小、规模、数据分布状况等的一类信息。比如表的行数、块数、平均每行的大小、索引的leaf blocks、索引字段的行数、不同值的大小等,都属于统计信息。 Oracle的基于成本的优化器(还有一种是基于规则的,武功过时了,不练了)正是根据这些统计信息数据,计算出不同访问路径下,不同连接方式下,各种计划的成本,最后选择出成本最小的计划。如果没有统计信息呢?会发生动态采样,就是在生产执行计划前去表、索引去进行数据采样。 怎么理解呢?还是从家到公司,有了地图和公交信息,高速收费情况等信息,大家就可以选择最合适的上班方案了。没有这些现成的信息你就需要实际去调研一下了,比较麻烦,而且可能造成不合适的选择。 3.某个SQL是否能优化? 怎么能确定一个SQL是否能优化呢?这个不太好回答,DBA们经常说先分析分析看看。那么分析什么呢:现在效率如何?执行计划?跑的时候等待事件?表多大?选择列上有无索引?选择性如何?有统计信息?连接方式?......又是这些名词,还没有完全理解的小伙伴不要着急,我不是卖野药的,马上就要表演啦! 其实呢,也可以不用这么复杂。一个非常劣质的SQL(跑几十分钟,甚至是几个小时的SQL)最终能不能有质的提速,主要就是看业务的本质上需要访问多少数据量,如果业务本质上需要访问的数据量越少,一般来讲提速余地就越大。简单吧,所以一个业务专家,你遇到了一个劣质SQL,不用DBA分析,你应该就知道有没有优化余地了。 怎么理解呢?一个大操场上有一个红色的玻璃球,让你去拿到,你没看见,地毯式的找半天,有人给你个坐标图,你10秒钟跑过去就找到了,这就是有提速余地,如果满操场上都是需要的红色玻璃球让你拿,无论怎么拿,都要拿半天,这就是没法有质的飞跃(就是没办法几秒钟、几分钟把活干完)。 下面我们循序渐进的讲一些案例吧。 01第一剑 少商剑:合理利用索引 1.1利用索引提高效率 INS_USER_571 表上有两个索引IDX_INS_USER1_571,IDX_INS_USER2_571分别对应列BILL_ID,EXPIRE_DATE列,SQL 和执行计划: select * from SO1.INS_USER_571 M where M.BILL_ID = '13905710000' and M.EXPIRE_DATE |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|