SQL调优与人们旅行,两者非常相似,我们只是想通过上述事例说明SQL调优相关的各个因素,以便大家能对SQL调优有一个更好的理解。经常会碰到有人丢过来一个SQL语句,然后问:这个SQL太慢了,帮我优化下吧。我只能直接告诉他:你提供的信息有限,我无法帮到你。就像上面旅行者的事例一样,要进行SQL调优,除了知道SQL语句,这相当于旅行者的出发地和目的地,还得知道SQL语句的执行计划,这相当于旅行者选择的路线,此外,还得知道运行SQL语句的数据环境,包括相关表的数据量,表上的索引、索引列以及相关数据分布,此外,还包括数据库的配置和软硬件环境等,这些,相当于除旅行者起止地点和路线外的其他诸多因素。
SQL语句的执行计划,就是为了获取SQL语句的最终结果,数据库优化器根据各方面因素,为其规划出的最优方法和路径,相当于旅游者的最佳路线。有时,根据SQL语句和其执行计划,一个经验丰富的技术人员,甚至不需要了解其他因素,也能很快找到SQL优化的思路和方法,而且往往效果明显。由此可见,SQL语句的执行计划,对SQL调优来说,至关重要。
目前各主流行关系库,就SQL调优的思路、方法和步骤而言,彼此几乎都是一样的,差别只是具体命令、格式、指标和实现等方面的细节内容。本文中,我们将对各主流关系库执行计划及其获取方法进行简要介绍和说明,进而为正确、深入掌握SQL调优打下坚实基础。各主流关系库中,不同关系库、同一关系库不同版本之间,执行计划及其获取方法的细节存在或多或少的差别。下面,我们仅就各主流关系库中,SQL调优最基础技术之——执行计划及其获取方法做简要介绍和论述。
1.Oracle
Oracle作为最完备、最成熟、最强大和最优雅的商业关系库,其执行计划无论从内部机制和外部获取和使用,也都是最完备、最成熟、最强大和最优雅的,这些特征体现在执行计划从产生到获取再到分析,以及解决SQL语句性能问题的方方面面。目前高版本的Oracle中,甚至做到了产生SQL语句执行计划过程的动态监测和修正,同时,解决SQL语句性能问题时,既提供了诸多外科手术式的多种调整和干预方法,也做到了通过注入方式进行调整和纠正的透明干预措施,这无论在商业库还是开源库中,都是遥遥领先或绝无仅有的。仅仅就获取SQL语句的方法而言,也体现了这一特点和优势。Oracle获取SQL语句执行计划的方法具体如下。
1)GUI工具:通过各种流行的Oracle开发或管理工具获取SQL语句执行计划,例如:PL/SQL
DEV,Toad等。
2)autotrace功能:autotrace为Oracle公司随Oracle软件提供的本族产品,通过该产品,可以很方便的获取SQL语句的执行计划、结果集和性能统计数据。
3)DBMS_XPLAN包:该包为Oracle公司随Oracle软件提供的用于获取SQL语句执行计划的内置包,该包功能非常强大,可以完成执行计划相关的各种任务,可谓Oracle中执行计划相关的最强大、最专业的工具。
4)SQL查询方法:通过用SQL语句,查询特定系统视图或指定表,以获取SQL语句的执行计划。
5)跟踪方法:通过启用Oracle的特定跟踪事件,通过对SQL语句相关的系统操作进行跟踪和记录,最后生成包含执行计划相关信息的跟踪文件。期间,为了得到可读性强的结果,可能需要通过特定工具对生成的跟踪文件进行加工处理。
2、SQL Server
SQL Server,世界三大商用关系库之一,人们俗称之为MSSQL,其于商用关系库市场拥有相当的占有率。作为美国微软公司的拳头产品,其优化器方面的功能还是相当强大,除了拥有完备的组件、模型、算法及众多的操作符(Operator),也为用户提供了多种获取SQL语句执行计划的方法和途径。此外,MSSQL执行计划也提供了非常丰富的内容和信息,从某种程度上讲,MSSQL执行计划中暴露的信息量,比Oracle还要丰富和详细。下面,我们就分别看下MSSQL中获取SQL语句执行计划的方法。
1)SQL Server管理工作室(SQL
Server Management Studio,简称SSMS):该工具是微软公司为MSSQL产品提供的本族GUI工具,无需另外获取和安装。该GUI工具功能非常强大,感觉几乎无所不能,界面也非常友好和易操作,尤其对初学或非专业人士更加方便。当然,即使是资深的专业人士,有时也会经常使用和依赖该工具,该工具与Oracle的EM GUI管理工具非常类似,只是,个人感觉SSMS比Oracle的EM功能更全面、体验更好些。言归正传,我们还是继续SQL语句执行计划的获取,通过SSMS,我们很容易获取SQL语句的执行计划,获取的执行计划为图形执行计划,也就是将SQL语句的执行计划通过图形的方式展示出来,这点,有点类似前述Oracle通过GUI工具获取SQL语句的执行计划,只是,MSSQL生成的图形执行计划更加友好、专业,信息量也更大。SSMS生成的图形执行计划中,每个图标代表执行计划中每个节点的操作,而图标间的箭头线,则代表数据在执行计划各节点间的流向。
SSMS生成的图形执行计划中,我们可以点击其中的每个图标或箭头线,然后,都会出现相应的工具提示(Tooltips)窗口和属性窗口,两个窗口中,都包含了执行计划中每个节点操作或数据流的详细信息,接下来,我们就可以对执行计划进行阅读和分析。美中不足的是,SSMS生成的图形执行计划虽然是一张漂亮而直观的大图,初学者乃至资深人士浏览起来非常方便,但对有些较为复杂的SQL语句来说,这张图也许会变得非常大,从而阅读时不得不通过频繁的缩放或滚动来进行浏览,这可能会存在少许的不便。此外,SSMS生成的图形执行计划还可以保存成一个.sqlplan文件,该文件实际以XML格式保存,因此,除了可以作为图形执行计划进行加载和浏览,还可以以XML格式进行阅读。
2)GUI工具:与Oracle一样,SQL Server也可以通过各种流行的开发或管理工具获取SQL语句执行计划。针对不同的工具,获取的执行计划的具体格式和内容也可能略有不同,因此,这里不再对该方法进行赘述。。
3)命令行(文本格式执行计划):通过执行相关命令,MSSQL也可以生成文本格式的执行计划,该执行计划通过缩进和竖线来表达其中各节点间的父子关系。这点与Oracle中,通过非GUI工具获取的执行计划计划类似,阅读和分析方法也完全相同,MSSQL中常用的获取SQL语句文本执行计划的命令如下所示。
SET SHOWPLAN_TEXT ON:获取SQL语句的文本执行计划,但只获取执行计划。
SET SHOWPLAN_ALL ON:获取SQL语句的文本执行计划,同时,还获取SSMS生成的图形执行计划中,工具提示和属性窗口中包含的各节点的相关详细信息。
4)命令行(XML格式执行计划):通过执行相关命令,MSSQL2005及更高版本可以获取XML格式的执行计划,想必大家都熟悉XML格式,这种格式能比较清晰的表达执行计划中各节点间的父子关系,而且,上面我们也有提到,XML格式的执行计划可以通过SSMS打开为图形格式的执行计划,同时,图形格式的执行计划也可以保存为XML格式的文件。XML格式的执行计划集图形格式和文本格式很多优点于一身,不但可以非常方便的通过程序对XML格式的执行计划进行处理,同时,还可以很方便的将其存储于数据库的相关字段。
以上简要介绍了MSSQL中获取SQL语句执行计划的方法,鉴于MSSQL各节点操作中包含大量的内容和信息,同时,这些信息的自解释性也比较强,大家可比较方便的进行阅读和分析,或者参考官方或其他相关资料,这里不再对这些信息进行一一解释,或许如果有时间,可以另开博文进行详细论述。
3、Mysql
目前,Mysql在互联网等行业可谓大行其道,但坦率的讲,其优化器表现并不像其他方面那么有优势。相比商业库,甚至某些开源库来说,Mysql优化器的功能还有待进一步增强和完善,输出的执行计划的内容和信息显得相对有限且晦涩难懂,尤其是,当前所有主流关系库中,只有Mysql的执行计划显得更加另类,因此,能读懂其他关系库执行计划,但未必就能读懂Mysql的执行计划。值得庆幸的是,随着Mysql版本的不断升级和优化器的不断完善,Mysql面对大数据集、大事务场景时的表现显得更为从容,性能也有了显著的改善和提升。下面,我们将对Mysql获取SQL语句执行计划的方法进行介绍和说明。
1)GUI工具:与Oracle一样,Mysql也可以通过各种流行的开发或管理工具获取SQL语句执行计划。针对不同的工具,获取的执行计划的具体格式和内容也可能略有不同,因此,这里不再对该方法进行赘述。
2)explain命令:目前,Mysql主要靠该命令来获取SQL语句的执行计划,虽然,该命令存在一些限制(例如:Mysql5.6版本之前,不能获取DML语句执行计划。)和误差,但是,目前也没有其他更好的可用工具和信息,至少,我们通过该命令获取的执行计划,可以研究和分析Mysql优化器内部解析SQL语句的过程,从而,判断SQL语句是否存在性能问题,以及如果SQL语句确实存在性能问题,进而想办法解决存在的问题。
4、Postgresql
该开源数据库产品,被人称作“免费版的Oracle”,但Posgresql的这一盛誉绝非浪得虚名,从内部机制到特性风格,无不体现了这一美誉的名副其实。读过PG源码的同学们对其优雅而严谨的风格赞叹有加,而这些风格也体现在Posgresql产品的方方面面。本帖主要讨论执行计划,不得不说,Postgresql的执行计划与Oracle也有诸多相似,只要能看懂Oracle执行计划,基本就能看懂Posgresql的执行计划,只是Posgresql执行计划更加体现了开源软件的风格,那就是简洁、灵活而强大。下面,我们就一起来欣赏Postgresql执行计划。
1)explain 命令:该命令产生文本格式的执行计划,同时,用该命令获取执行计划时,我们有两个选项可以使用。explain获取执行计划的方法具体如下。
前面也已经说到,Postgresql文本格式的执行计划与Oracle和SQL Server文本格式的执行计划非常相似,甚至让人感觉更加简洁、灵活和强大,Postgresql文本格式的执行计划也是由分层缩进的多个节点及操作组成。此外,explain命令还提供verbose等更多选项,具体大家可以查阅相关文档,此处不再赘述。
2)GUI格式工具:查看比较复杂和冗长的文本执行计划,尤其是对于入门或业余人员来讲,将是件非常繁琐的事情,时间一长就容易产生疲劳或混乱的感觉。这种仅仅靠缩进表示各节点层级关系的格式,即使经验丰富的资深专业人员,阅读和分析复杂SQL语句的执行计划,也并非易事。为了解决文本执行计划难以阅读和分析的问题,图形执行计划就排上了用场。目前,能生成Postgresql图形格式执行计划的工具不是很多,但还是有一些,例如:pgadmin等。
同为开源关系库,仅就优化器来说,个人认为Postgresql比Mysql更成熟和强大一些,Postgresql的优化器几乎可以和成熟的商业库媲美。
本文对主流关系库的执行计划及其获取方法暂时介绍至此,希望能帮到各位同学,也希望自己可以参考研究。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/8484829/viewspace-3152241/ ,如需转载,请注明出处,否则将追究法律责任。