SQL语句调优心得

SQL语句的调优在性能优化工作中至关重要,甚至有人说80%以上的数据库性能问题会归结到SQL语句调优。SQL语句的编写形式千变万化,DB2进行的语句内部转换扑朔迷离,语句的执行方式也纷繁复杂。因此,许多刚开始接触SQL语句调优的朋友会感到不得要领,疲于应付,面对层出不穷的复杂情况望洋兴叹。

其实,SQL优化“万变不离其宗”。所谓“变”,指的是SQL语言高度灵活,DB2处理SQL时产生的优化结果会随着各种因素的变化而变。所谓“宗”,指的是DB2编译和运行时,分析、转换、优化、执行SQL的机制。在调优SQL时,不应把DB2当成“黑盒”,停留在简单应用上,而是应该通过学习和实践,逐渐掌握DB2处理SQL的规律。例如SQL语句形式、统计信息、外部参数对优化器的影响、查询重写规则、各种计划节点的实际含义等。随着对这个“宗”的深入理解,你将能够从DB2的角度看待SQL,而不是相反。还有个建议:不妨多阅读和分析实际的查询重写结果和查询访问计划,理解什么才是期望的查询重写和访问计划行为,找出不符合期望结果的地方,从而能顺利找到问题根源。
 
SQL是一种“聪明”的数据库查询与程序设计语言,对于SQL的应用,需要从一开始就考虑数据库应用的性能问题。使用SQL语句,用户不需要指定查询的具体执行方案,而只需要描述查询结果集。同一查询结果集会有多种SQL语句描述形式。不过,规范的SQL语句形式比起其他形式更容易被DB2优化。虽然DB2优化器有很强的查询重写能力,能够将用户输入的SQL语句转换为优化形式,但并不总是可以把各种形式的SQL语句重写成最优的形式。所以,我们在编写SQL时,要遵循必要的规范,尽量避免性能问题的出现。
 
优化器是用来产生访问计划(Access Plan)的组件。一个SQL要以最优性能运行,有赖于优化器产生最优的访问计划。SQL语句编写规范,也是为了有利于优化器产生最优的访问计划而提出的。下面先来了解一下SQL语句在DB2中的编译过程。
SQL编译器很像一个程序语言编译器,不过它输出的是可以被DB2运行时(Runtime)执行的代码段(Section)。SQL编译器将非结构化的SQL语句代码转换成经过优化的可执行代码,而优化器的工作则是在这个过程中选择最优的访问计划。编译器内部用QGM(Query Graph Model)来表示SQL。QGM是一种功能强大的可以表示各种形式SQL语义的图结构。
我们看看编译SQL的各个步骤:
  语法分析(Parse Query)。编译器验证SQL的语法时,如果检测到任何语法错误,就会停止处理,返回相应的错误提示给用户,经过语法分析后,SQL就被转成QGM形式。
  检查语义(Check Semantics)。在这个步骤中,编译器确保查询语句的各部分没有不一致的地方。比如,编译器会检查一个传给函数YEAR的列是否是日期时间类型。编译器还会把参照完整性约束、触发器和视图等对象加到QGM中。
 
  重写查询(Rewrite Query)。编译器在不改变语义的基础上,对查询进行有利于优化的重写,并对QGM形式的SQL进行变换。
  下推分析(Pushdown Analysis)。处理联邦查询(Federated Query)时才会有这个步骤。其主要任务是告诉优化器查询中的操作是否可以发到远程数据源执行。
  优化访问计划(Optimize Access Plan)。在这一步,查询优化器分析QGM,生成各种访问计划。同时用表、索引和列上的统计信息,估计计划的代价。然后选择代价最小的计划作为最终的访问计划。这个访问计划可以使用解释工具(Explain Tool)查看。
  远程SQL生成(Remote SQL Generation)。处理联邦查询时才会有这个步骤。联邦查询的访问计划中,会含有对远处数据表的访问。这里编译器会根据远程表的访问计划,生成用于发到远程的SQL语句。
  生成可执行代码(Generate Executable Code)。在这最后一步,编译器会根据访问计划和QGM生成一个可执行的代码段(Section)。
“重写查询”这一步是将SQL语句转换为有利于优化器生成最优计划的形式,可以称为逻辑优化过程。而“优化访问计划”这一步可以称为物理优化过程。查询优化器会评估各种可能的访问计划,包括操作(连接、应用谓词和聚集)的顺序和实现方法(表扫描、索引扫描和各种连接方法)。优化器还会根据代价模型计算每个计划的代价,包括中间结果的大小、CPU、I/O和内存等代价。
影响访问计划的主要因素有:CPU的速度(即数据库管理器的CPUSPEED设置)、存储设备的反应和传输速度(即表空间的OVERHEAD 和TRANSFERRATE设置)、数据库工作的并行模式(数据库管理器的INTRA_PARALLEL 和MAX_QUERYDEGREE)设置、并发环境(数据库AVG_APPLS设置、隔离级别以及可用锁数量)、带宽(数据库管理器COMM_BANDWIDTH设置,在分区间并行时有效)、优化级别、内存设置、统计信息等。这些因素里面,优化级别、内存设置和统计信息等几个因素是可调节的,而且对于SQL调优也是最重要的。

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

转载于:http://blog.itpub.net/25714550/viewspace-757443/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值