欢迎来到天天文库
浏览记录
ID:50279783
大小:68.00 KB
页数:18页
时间:2020-03-07
《外文资料译文及原文.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、外文资料译文及原文简介有关如何调优数据库系统和应用程序的好的建议的来源有很多。比如OLTP应用程序的DB2调优技巧(以前在IBM®DB2®开发者园地上发表)之类的文章通过使用事务和数据并行性以及分析查询方案,给出了从表空间和索引设计到缓冲池的内存分配等方面的建议。这些方面的内容是性能调优的基础知识。但是,有关如何组织存储过程自身中的逻辑并着眼于其性能的专门建议却并不多见。本文就提供了这样一种建议。尽管本文着重于介绍SQL过程,但是这里所提供的大多数信息同样适用于用其它语言编写的在应用程序中或存储过程中嵌入的SQL逻辑。背景知识和术语
2、在深入研究详细问题之前,让我们先想想DB2中有关过程化SQL的一些基本术语和概念。过程化SQL构造(例如标量变量、IF语句和WHILE循环)是在DB2UniversalDatabase™(UDB)V7发行版中引入DB2的。以前的DB2发行版支持C和Java™作为存储过程的语言。V7引入了SQL存储过程,以及其它许多可以促进OLTP应用程序开发的特性(例如临时表、应用程序保存点和标识列)。当创建SQL过程时,DB2将过程主体中的SQL查询与过程逻辑区分开来。为了使性能最优,SQL查询被静态地编译成包中的节。(对于静态编译的查询而言,节
3、主要是由DB2优化器为该查询选择的存取方案构成的。包是节的集合。在过程的执行期间,每当控制从过程逻辑流向SQL语句时,在DLL和DB2引擎之间就存在“上下文切换”。(在DB2V8中,SQL过程是在“不受保护的方式”下运行的,即与DB2引擎在相同的寻址空间中。因此我们这里谈及的上下文切换并不是操作系统级别上的完全的上下文切换,而是指DB2中层的更换。)减少频繁调用的过程(例如OLTP应用程序中的过程)或者处理大量行的过程(例如执行数据清理的过程)中的上下文切换次数,对它们的性能有显著的影响。本文中的几个技巧恰好旨在减少这些上下文切换。
4、刚开始的时候(DB2通用数据库V7GA),只允许在SQL过程中使用SQL过程语言(通常称为SQLPL)。后来(在DB2UDBV7.2中),在SQL函数和触发器主体中开始支持该语言的子集。SQLPL的这个子集即所谓的内联(inline)SQLPL。“内联”一词突出显示了它与完整语言的重要区别。SQLPL-10-过程是通过将其单独的SQL查询静态地编译成包中的节实现的,而内联SQLPL函数就象其名称所展示的,是通过将函数主体内联到使用它的查询中实现的。稍后我们将再看一下内联SQLPL及其用法的一些示例。从多个SQL语句到一个SQL表达式
5、跟其它编程语言一样,SQL语言提供了两类条件构造:过程型(IF和CASE语句)和函数型(CASE表达式)。在大多数环境中,可使用任何一种构造来表达计算,到底使用哪一种只是喜好问题。但是,使用CASE表达式编写的逻辑不但比使用CASE或IF语句编写的逻辑更紧凑,而且更有效。使用SQL的一次处理一个集合语义,诸如循环、赋值和游标之类的过程化构造允许我们表达那些只使用SQLDML语句是不可能表达的计算。但是,当我们拥有一些可以随意使用的过程语句时,即使我们手头的计算实际上仅使用SQLDML语句就可表达,但转换成过程语句还是有风险的。正如我
6、们以前提到的,过程计算的性能与使用DML语句表达的同一个计算的性能相比会慢几个数量级。在研究改进现有过程逻辑的性能时,为消除游标循环而花费的任何时间都可能是值得的。改进游标性能如果存储过程中的逻辑确实需要游标,那么要使性能最优,请牢记下面这些内容。首先,请确保不使用高于您所需的隔离级别。隔离级别决定了DB2对过程读取或更新的行应用的锁定的数量。隔离级别越高,DB2将执行的锁定越多,因此为同一资源而竞争的应用程序之间的并发就越少。例如,使用可重复读(RepeatableRead,RR)隔离级别的过程将形成对其读取的任何行的共享锁,而使
7、用游标稳定性(CursorStability,CS)的过程只会锁定任何可更新游标的当前行。可以使用DB2_SQLROUTINE_PREPOPTS注册表变量来指定SQL过程的隔离级别。DB2中缺省的隔离级别是游标稳定性。但是,当然了,为了保持应用程序的正确性,有时需要使用可重复读。还需记住一件重要的事情,一旦创建了需要可重复读的过程,必须将DB2_SQLROUTINE_PREPOPTS重新设置回较低的隔离级别。-10-在尝试改进游标性能时需要牢记的一个相关问题是游标的可更新能力。如果游标涉及的行是可以使用INSERT或DELETE语句
8、中的WHERECURRENTOF子句进行更新或删除,那么它就是可删除的。当游标可删除时,DB2必须获取行上的互斥锁(与共享锁相对),并且不能执行行分块。行上的互斥锁甚至可以防止其它应用程序读取该行(在互斥锁被释放之前,这些应用程序必须
此文档下载收益归作者所有