快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

澳门新葡亰8455下载app_龟发之家论坛



您澳门新葡亰8455下载app想进修调优 SQL PL 的一些技术吗?假如是这样的话,本文将描述一些调优 IBM® DB2® Universal Database™(UDB)V8.2 for Linux,UNIX®, and Windows® 中的 SQL 历程的常见例子,并将分外关注从其他数澳门新葡亰8455下载app据库治理系统中移植过来的历程。念头

SQL 历程说话(SQL PL)是许多 DB2 开拓职员对象箱中的一个盛行对象。当将利用法度榜样从 Oracle、Sybase 或 Microsoft® SQL 办事器迁移或移植到 DB2 中时,更是如斯。然而,SQL PL 的即时可用性也给它带来了一些问题:

首先,在许多开拓职员的意识中,开拓历程逻辑比编写 SQL 要轻易得多。是以,虽然已经证实 DB2 是带有最前沿优化器的关系引擎,但它并没有获得充分使用。

其次,诸如 Migration Tool Kit(MTK)之类的自动化对象将天生对 T-SQL 或 PL/SQL 所创建逻辑的 SQL PL 模拟。众所周知,纯挚模拟的机能老是不如其原型。

在前面的文章中,我曾描述了分手使用 SQL PL Profiler 和 SQL 历程跟踪 来发明机能和逻辑问题。本文中,我将应用 SQL PL Profiler 来阐明一组慢速 SQL PL 的常见例子,并阐明 DB2 V8.2 若何独自优化它们,或者您自己若何可以调优 SQL PL。

通俗 SQL 历程

假如您有 Microsoft SQL Server 或 Sybase 方面的背景常识,那么您就会很好地懂得这些历程。除了一条 CALL 语句,这个典型的利用法度榜样中将不存在任何 SQL。经由过程这个典型所熟识到的好处有两个:

首先是封装。例如,假如查询十分繁杂,就不应重复查询多次,而是应该将它存储在某一个地方。

其次是缓存。存储历程中的代码是预先编译的。而利用法度榜样中的代码平日是动态 代码。

为了办理第一个问题,DB2 支持内联 SQL PL 的观点。DB2 容许将简单逻辑或查询封装在 SQL 函数中。当从调用者履行该 SQL 函数时,其主体便是扩展到调用者中的宏。

为了办理第二个问题,DB2 应用了包缓存。该缓存不仅记着近来履行的历程,还记着了曩昔履行的语句。是以,在第一次编译 SQL 语句之后,后来的调用只要继承履行相同的履行计划即可。我们用一个例子来阐明:

1 CREATE P澳门新葡亰8455下载appROCEDURE get_dept_emps(dept_id dept_id_t)

2 BEGIN

3  DECLARE cur CURSOR WITH RETURN FOR

4   SELECT emp_name, emp_id FROM emp

5   WHERE emp_dept_id = dept_id;

6  OPEN cur;

7 END

留意,您可以从“下载”小节中下载带有完全 DDL 的所有例子。可以从 developerWorks 下载本文全文应用的 SQL PL Profiler。下面的屏幕快照展示了上述通俗 SQL 历程的 100 次履行。

那么,光阴耗损在哪些地方了呢?DB2 必要处置惩罚这条 CALL 语句。假设曩昔已经缓存了这个历程,那么,DB2 就必要初始化 SQL 历程,以便履行它。然后,DB2 打开从历程中返回的游标,并处置惩罚分配给结果集的定位器。着末,DB2 才可以真正取得所返回的行。做这么多事情仅仅是为了打开一个游标!

现在,让我们应用内联 SQL PL 来取得相同的效果:

1 CREATE FUNCTION get_dept_emps_f(dept_id dept_id_t)

2 RETURNS TABLE(emp_name name_t,

3         emp_id  emp_id_t)

4 RETURN SELECT emp_name, emp_id

5     FROM emp

6     WHERE emp_dept_id = emp_dept_id;

我们现在用 DECLARE 游标及其各自的 OPEN 语句来调换驱动法度榜样历程中的 CALL 和所有定位器代码,并测试结果:

这个图有什么问题吗?DECLARE 和 DROP 之间的 insert 语句每次都要从新进行编译,由于 DB2 无法知道该 DGTT 下次是否将具有相同的属性。实际上,DECLARE 和 DROP 之间有许多语句,都可用于处置惩罚该临时表结果集的款式,直到它终极满意要求为止。

为了避免这种猖狂编译,将该临时表的声明移至一个零丁历程中会更相宜一些,该历程只在启动澳门新葡亰8455下载app事情负载时履行一次。

正如您可以在上面看到的,其结果是令人震动的。但这里将有更多要懂得的器械。请察看取代 DROP 语句的 DELETE 语句。它将老是因用户引起的差错而掉败,然后,将由一个 continue 处置惩罚法度榜样办理这个差错。这里发生了什么事?

为了前进速率,必要优化临时表,是以,当插入行时,DB2 不用劳神在临时表中探求余暇空间,而是将表行径调换为 APPEND ONLY。虽然老例的 DELETE 将删除这些行,然则它不会真正让 DB2 收受接收这些空间。利用法度榜样将继承破费越来越多的用户临时表空间。

实际上,别的一个身分在这里供给了赞助。那便是,所有 DGTT 都被声明为 NOT LOGGED。终究,您可以相称轻易地从新构建临时表的内容。假如 NOT LOGGED 表在履行数据改动语句时代碰着了履行差错,那么对付 DB2 来说,就只有一个选择:清空(truncate)该表。而这便是 DELETE 语句所进行的事情。

前提处置惩罚法度榜样

谋略机说话有两种处置惩罚差错的常用措施。

第一种措施要求法度榜样在在进行每一个重大年夜操作之后,反省差错。在 DB2 中编写 C-UDF 或 C 存储历程的开拓职员已经学会在其代码的每条 EXEC SQL 语句之后反省 SQLCA。

调优存在谓词

我无法理解开拓职员为何用下方所示要领编澳门新葡亰8455下载app写存在反省(existential check),然则由于他们这样做了,以是我们就来评论争论它。

优秀的开拓职员无意偶尔候彷佛害怕履行那些可能导致 NOT FOUND 警告的语句。下面的例子是一条仿照 MERGE 的语句。

这两个存在反省为何不好?

首先,要求 DB2 回答一个不相关的问题。仅仅为了反省某些行是否存在而迫使 DB2 谋略一个表中的行数是一种价值极其高昂的选择。

其次,除非某一个表应用语句级触发器,否则,用显式查询来反省某一行是否存在的价值就与未找到要更新的行就履行 update 语句的价值一样高。在该行没有被查找到的环境下,这两种要领没有什么差别。然则假如已经经由过程 EXIST 谓词找到了这个行,那么 UPDATE 照样必须再次查找它。

是以,假如没有更多注释,这里有一种更好的措施,可用这种措施来处置惩罚平日用来处置惩罚前提更新和履行存在反省的显式要领。

当然,可以老是对单行应用显式 EXISTS 谓词和 MERGE 语句,两者将得到相似的机能。

CALL 逃避

有许多种在紧凑轮回(tight loop)中调用历程的环境。应用行列步队或关系中心表(staging table)的批处置惩罚历程便是一个例子。行列步队中的每个工具假如满意指定前提,就可能触发特殊处置惩罚。对付任何给定工具,这些前提平日很少为真。是以,处置惩罚该逻辑的历程有一个最外层的反省,抉择是履行主体的另外部分,照样不采取任何动作而返回。

您可能还会对下面的文章感兴趣: