分享到:

SQL执行效率的预评估

日期:2016-10-20     阅读:136     文章来源:源美设计     标签:SQL

在大多数情况下,一套应用系统的效率问题在表象上都指向了I/O问题。I/O效率低下的确是可能的原因之一,但除了存储设备在硬件、操作系统方面的约束原因之外,应用系统数据库设计及数据库操作的SQL语句也可能是产生I/O瓶颈问题的根本性原因。试想如果我们想从北京到天津,但我们偏偏要从郑州绕一圈过去,这时候开什么车已经不重要了,因为这时路远是主要矛盾。

因此,在应用系统开发之初,SQL程序员除了要了解业务需求以外,还必须关注应用中SQL的效率可用性。SQL的效率可用性在开发中往往可以反映为如下几个技术层面的运用:

❑恰当的数据库连接机制。

❑高效的游标使用和管理。

❑SQL执行中的硬解析、软解析。

❑无论哪种解析,其计划是优化的。

如下图所示:

blob.png

Oracle中的客户连接和SQL执行

Oracle客户连接是以进程方式体现在操作系统中的,而在Oracle中则表现为一个个的服务器进程。每个服务器进程都有其独立的堆栈结构、会话数据信息、游标信息、数据排序区域。不仅如此,所有的服务器进程会共享Oracle SGA,在SQL执行过程中,所有的SQL会在SGA中的Library Cache(库缓存)内存结构中被缓存,同时被缓存的还有该SQL对应的可执行伪代码(Executing Plan:具体的执行计划)。

客户连接本身就是一个资源消耗型工作,从应用开发的角度来讲,数据库同时连接的用户数应尽可能地少,这样才会降低服务器的压力。同时,对于某

个具体的用户连接进程来说,其数据库连接最好在应用启动时完成,而不是在应用进行中不断地连接、断开、再连接。推而广之,在一套多层结构的应用里,中间件层(应用服务器层)提供的“数据库连接池”(connection pool功能)就是用于实现这个目的的,它可保证不会出现频繁的数据库连接及断开操作。

所以,中间件服务器的数据库连接缓存池可以起到连接缓冲的作用,这是一种在互联网下避免数据库连接冲击载荷的重要技术手段。

站在SQL的角度,最大限度地减少SQL执行过程中的语法分析活动,是SQL优化的一个准则。我们知道,在Oracle执行SQL语句时,语法分析是解释并执行SQL语句的首要过程,包括分析SQL句法、检查执行权限、生成执行计划、装载共享结构等。语法分析结束后,数据库优化器将确定其执行计划,并将其编译成伪代码后提交Oracle内核执行。语法分析有两种不同类型的分析方式和操作步骤:硬解析和软解析。

如果数据库内核系统发现一个SQL语句是首次被提交,没有在共享池中找到该SQL的执行痕迹,则数据库不得不对这条语句执行硬解析,包括SQL语法分析、确定执行计划、编译执行等过程。这种解析方式必然会造成对资源的大量使用。

软解析与硬解析不同。如果一个SQL语句被提交给数据库,而这条语句(SQL及其对应的SQL执行计划Execution Plan)可以在一个称为库缓存(Library Cache)的共享池中找到,那这条SQL语句可能就不必再次硬解析了,原因是不久以前(若干时间内,可能是几分钟或几小时内)某个用户曾经执行过这条SQL语句。如果这条SQL语句已被缓存到库缓存中(共享),其语法分析和编译结果可以被后续的用户所使用,从而避免再次被解析。

显然,这有益于降低系统资源的使用,提高整体性能。有一点需要说明,虽然这种情况下的硬解析过程省略了,但SQL的句法分析和用户执行权限检查仍然存在,因此,软解析仍然会部分消耗系统资源。这是SQL执行的必然代价。

从性能上看,一条SQL在经历硬解析后,如果再次被执行,则执行应为软解析方式。这就要求SQL在编程中具有一致性。因此,在设计过程中最好能够制定某种编程规范。我曾在北京的一家著名数据处理公司看到过其内部编制的SQL规范,摘取其中几条供大家参考,如下所示:

对于表名的使用

规则一:必须大写

规则二:多表连接查询,表名按升序自然排列,不能含有多余的空格

规则三:优先使用预定义视图,而非在线视图(inline view)或子查询

规则四:使用在线视图(inline view)或子查询时,请先行提交需求

……

对于列名的使用

规则一:必须小写

规则二:列的出现顺序严格按照其在表中的位置按顺序出现,不能含有多余空格

……

SQL语句所使用的变量

规则一:使用绑定变量

规则二:变量的数据类型定义需采用%type

……

SQL模块化的要求

规则一:基础模块建议在存储过程、函数中完成

规则二:基础模块群建议在包中完成

SQL语句的注释说明

……

在这些规范中,可看到有关规范化的两个举措:

❑SQL的规范化编写

❑SQL的可重用性侧重

程序员可通过编写尽量标准且通用的SQL语句,来适应这种硬解析及软解析执行机制,避免系统中出现大量“陌生”的SQL语句,进而减少对CPU资源的申请(次数和时间),这不也是优化的一部分吗?

为了保证绝大多数SQL语句可以在共享池中共享,程序代码中的SQL应尽可能使用绑定变量,这样可以避免SQL在执行中因变量的不同,而导致数据库优化器对SQL语义曲解,进而导致硬解析出现。

当然,绑定变量的使用也是典型的双刃剑,但大多数情况下其效果是好的。不过有一点要提醒的是,在程序设计阶段就进行约定非常重要。SQL编程规范要争取在设计阶段完成。



文章引用:http://www.szymweb.com/new/131.html

本站文章为深圳网站建设·源美设计原创策划,如有版权纠纷或者违规问题,请联系我们删除,谢谢!

上一篇:数据库视图的使用评估

下一篇:你知道与SEO有关的一切吗?

返回列表
最新案例
OUR ADVANTAGE WORKS