ITPub博客

首页 > > > 主流关系库SQL调优/SQL优化技术精髓之——执行计划(Explain Plan)

主流关系库SQL调优/SQL优化技术精髓之——执行计划(Explain Plan)

作者:sqysl 时间:2019-10-26 08:46:46 0 删除 编辑
一位旅行者问你:我从旧金山到芝加哥需要多久?你肯定会一脸茫然,觉得无法回答。因为,除了他的出发地和目的地外,你对这个旅行者一无所知,例如:他选择的行进路线,他选择的交通工具,他需要携带多少物品等。他从旧金山直接去芝加哥,与先到休斯顿,再从休斯顿去芝加哥,两个路线肯定不同;他乘坐飞机,与他步行又有天壤之别;同时,如果他只身从旧金山到芝加哥,与他需要同时携带大量物品,也相差甚远,各种因素导致从旧金山到芝加哥的时间差别非常大。因此,这个旅行者的问题任何人都无法回答,当然,你也可以,但答案大概率是错的。

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获取执行计划的方法具体如下。

  • explain SQL语句:该命令只产生执行计划,并不实际执行其中的SQL语句。
  • explain analyze SQL语句:该命令除了产生执行计划,还会实际执行其中的SQL语句,同时,还会给出该SQL语句运行时的相关信息,因此,我们在分析DML类型的SQL语句时,一定要注意这点。

前面也已经说到,Postgresql文本格式的执行计划与Oracle和SQL Server文本格式的执行计划非常相似,甚至让人感觉更加简洁、灵活和强大,Postgresql文本格式的执行计划也是由分层缩进的多个节点及操作组成。此外,explain命令还提供verbose等更多选项,具体大家可以查阅相关文档,此处不再赘述。

2)GUI格式工具:查看比较复杂和冗长的文本执行计划,尤其是对于入门或业余人员来讲,将是件非常繁琐的事情,时间一长就容易产生疲劳或混乱的感觉。这种仅仅靠缩进表示各节点层级关系的格式,即使经验丰富的资深专业人员,阅读和分析复杂SQL语句的执行计划,也并非易事。为了解决文本执行计划难以阅读和分析的问题,图形执行计划就排上了用场。目前,能生成Postgresql图形格式执行计划的工具不是很多,但还是有一些,例如:pgadmin等。

同为开源关系库,仅就优化器来说,个人认为Postgresql比Mysql更成熟和强大一些,Postgresql的优化器几乎可以和成熟的商业库媲美。

本文对主流关系库的执行计划及其获取方法暂时介绍至此,希望能帮到各位同学,也希望自己可以参考研究。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/8484829/viewspace-3152241/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
大学毕业至今,一直深耕于数据库领域20余载,擅长数据库优化、数据库分析诊断、数据库规划设计等,曾任职多家知名大型企业,多次独立承担并成功上线关键大型项目。

注册时间:2008-06-27

  • 博文量
    365
  • 访问量
    725338