SQL过程的性能:提示和技巧

简介

有关如何调优数据库系统和应用程序的可用建议来源有很多。诸如 OLTP 应用程序的 DB2 调优技巧(以前在 IBM DB2 开发者园地上发表)之类的文章通过使用事务和数据并行性以及分析查询方案,给出了从表空间和索引设计到缓冲池的内存分配等方面的建议。这些方面的内容是性能调优的基础知识。

但是,有关如何组织存储过程自身中的逻辑并着眼于其性能的专门建议却并不多见。本文就提供了这样一种建议。尽管本文着重于介绍 SQL 过程,但是这里所提供的大多数信息同样适用于用其它语言编写的在应用程序中或存储过程中嵌入的 SQL 逻辑。

背景知识和术语

在深入研究详细问题之前,让我们先回顾 DB2 中有关过程化 SQL 的一些基本术语和概念。过程化 SQL 构造(例如标量变量、IF 语句和 WHILE 循环)是在 DB2 Universal Database (UDB) V7 发行版中引入 DB2 的。以前的 DB2 发行版支持 C 和 Java 作为存储过程的语言。V7 引入了 SQL 存储过程,以及其它许多可以促进 OLTP 应用程序开发的特性(例如临时表、应用程序保存点和标识列)。

当创建 SQL 过程时,DB2 将过程主体中的 SQL 查询与过程逻辑区分开来。为了使性能最优,SQL 查询被静态地编译成包中的节。(对于静态编译的查询而言,节主要是由 DB2 优化器为该查询选择的存取方案构成的。包是节的集合。有关包和节的更多信息,请参阅 DB2 SQL 参考大全,第 1 卷。)另一方面,过程逻辑被编译成 DLL(动态链接库)。

在过程的执行期间,每当控制从过程逻辑流向 SQL 语句时,在 DLL 和 DB2 引擎之间就存在“上下文切换”。(在 DB2 V8 中,SQL 过程是在“不受保护的方式”下运行的,即与 DB2 引擎在相同的寻址空间中。因此我们这里谈及的上下文切换并不是操作系统级别上的完全的上下文切换,而是指 DB2 中层的更换。)减少频繁调用的过程(例如 OLTP 应用程序中的过程)或者处理大量行的过程(例如执行数据清理的过程)中的上下文切换次数,对它们的性能有显著的影响。本文中的几个技巧恰好旨在减少这些上下文切换。

刚开始的时候(DB2 通用数据库 V7 GA),只允许在 SQL 过程中使用 SQL 过程语言(通常称为 SQL PL)。后来(在 DB2 UDB V7.2 中),在 SQL 函数和触发器主体中开始支持该语言的子集。SQL PL 的这个子集即所谓的 内联(inline)SQL PL。“内联”一词突出显示了它与完整语言的重要区别。SQL PL 过程是通过将其单独的 SQL 查询静态地编译成包中的节实现的,而内联 SQL PL 函数就象其名称所展示的,是通过将函数主体内联到使用它的查询中实现的。稍后我们将再看一下内联 SQL PL 及其用法的一些示例。

现在,让我们研究在使用 SQL 过程语言时可用来提高性能的一些具体工作。

在只使用一条语句即可做到时避免使用多条语句

让我们从一个简单的编码技巧开始。如下所示的单个 INSERT 行序列:

INSERT INTO tab_comp VALUES (item1, price1, qty1);
INSERT INTO tab_comp VALUES (item2, price2, qty2);
INSERT INTO tab_comp VALUES (item3, price3, qty3);

可以改写成:

INSERT INTO tab_comp VALUES  (item1, price1, qty1),
(item2, price2, qty2),
(item3, price3, qty3);

执行这个多行 INSERT 语句所需时间大约是执行原来三条语句的三分之一。孤立地看,这一改进看起来似乎是微乎其微的,但是,如果这一代码段是重复执行的(例如该代码段位于循环体或触发器体中),那么改进是非常显著的。

类似地,如下所示的 SET 语句序列:

SET A = expr1;
SET B = expr2;
SET C = expr3;

可以写成一条 VALUES 语句:

VALUES expr1, expr2, expr3 INTO A, B, C;

如果任何两条语句之间都没有相关性,那么这一转换保留了原始序列的语义。为了说明这一点,请考虑:

SET A = monthly_avg * 12;
SET B = (A / 2) * correction_factor;

将上面两条语句转换成:

VALUES (monthly_avg * 12, (A / 2) * correction_factor) INTO A, B;

不会保留原始的语义,因为是以“并行”方式对 INTO 关键字之前的表达式进行求值的。这意味着赋给 B 的值并不以赋给 A 的值为基础,这是原始语句预期的语义。

从多个 SQL 语句到一个 SQL 表达式

跟其它编程语言一样,SQL 语言提供了两类条件构造:过程型(IF 和 CASE 语句)和函数型(CASE 表达式)。在大多数环境中,可使用任何一种构造来表达计算,到底使用哪一种只是喜好问题。但是,使用 CASE 表达式编写的逻辑不但比使用 CASE 或 IF 语句编写的逻辑更紧凑,而且更有效。

请考虑下面的 SQL PL 代码片段:

IF (Price <= MaxPrice) THEN
INSERT INTO tab_comp(Id, Val) VALUES(Oid, Price);
ELSE
INSERT INTO tab_comp(Id, Val) VALUES(Oid, MaxPrice);
END IF;

IF 子句中的条件仅用于决定将什么值插入 tab_comp.Val 列中。为了避免过程层和数据流层之间的上下文切换,可利用 CASE 表达式将相同的逻辑表示成一个 INSERT 语句:

INSERT INTO tab_comp(Id, Val)
VALUES(Oid,
CASE
WHEN (Price <= MaxPrice) THEN Price
ELSE MaxPrice
END);

值得注意的是,CASE 表达式可在任何希望有标量值的上下文中使用。特别地,可在赋值符号的右边使用它们。例如:

IF (Name IS NOT NULL) THEN
SET ProdName = Name;
ELSEIF (NameStr IS NOT NULL) THEN
SET ProdName = NameStr;
ELSE
SET ProdName = DefaultName;
END IF;

可以改写成:

SET ProdName = (CASE
WHEN (Name IS NOT NULL) THEN Name
WHEN (NameStr IS NOT NULL) THEN NameStr
ELSE DefaultName
END);

实际上,这个特殊的示例有一个更好的解决方案:

SET ProdName = COALESCE(Name, NameStr, DefaultName);

时间: 2024-11-08 17:37:21

SQL过程的性能:提示和技巧的相关文章

PostgreSQL SQL 语言:性能提示

本文档为PostgreSQL 9.6.0文档,本转载已得到原译者彭煜玮授权. 1. 使用EXPLAIN PostgreSQL为每个收到查询产生一个查询计划. 选择正确的计划来匹配查询结构和数据的属性对于好的性能来说绝对是最关键的,因此系统包含了一个复杂的规划器来尝试选择好的计划. 你可以使用EXPLAIN命令察看规划器为任何查询生成的查询计划. 阅读查询计划是一门艺术,它要求一些经验来掌握,但是本节只试图覆盖一些基础. 本节中的例子都是从 9.3 开发源代码的回归测试数据库中抽取出来的,并且在此

在SQL server的性能优化过程中的常见技巧

在SQL server 的http://www.aliyun.com/zixun/aggregation/14109.html">性能优化过程中,TSQL的语句优化是很重要的一环.当您使用各种手段找出系统最需要优化的语句后,应该如何对该语句进行优化呢?下面列出一些TSQL 语句优化的常见技巧. 1. 语句的执行计划分析 首先要对该语句的执行计划(execution plan)进行分析,找出语句运行慢的原因.比如说, <>在检查执行计划是否包含table scan /index

SQL Server数据库性能优化技巧

设计1个应用系统似乎并不难,但是要想使系统达到最优化的性能并不是一件容易的事.在开发工具.数据库设计.应用程序的结构.查询设计.接口选择等方面有多种选择,这取决于特定的应用需求以及开发队伍的技能.本文以SQL Server为例,从后台数据库的角度讨论应用程序性能优化技巧,并且给出了一些有益的建议. 1 数据库设计 要在良好的SQL Server方案中实现最优的性能,最关键的是要有1个很好的数据库设计方案.在实际工作中,许多SQL Server方案往往是由于数据库设计得不好导致性能很差.所以,要实

SQL Server 2005命令提示实用工具

本文汇总了SQL Server 2005命令提示实用工具,供参考学习应用. 实用工具 说明 安装位置 bcp 实用工具 用于在 Microsoft SQL Server 实例和用户指定格式的数据文件之间复制数据. x:Program FilesMicrosoft SQL Server90ToolsBinn dta 实用工具 用于分析工作负荷并建议物理设计结构,以优化该工作负荷下的服务器性能. x:Program FilesMicrosoft SQL Server90ToolsBinn dtexe

调优SQL过程

您想学习调优 SQL PL 的一些技巧吗?如果是这样的话,本文将描述一些调优 IBM DB2 Universal Database(UDB)V8.2 for Linux,UNIX, and Windows 中的 SQL 过程的常见例子,并将特别关注从其他数据 库管理系统中移植过来的过程.动机 SQL 过程语言(SQL PL)是许多 DB2 开发人员工具箱中的一个流行工具.当将应用程序 从 Oracle.Sybase 或 Microsoft SQL 服务器迁移或移植到 DB2 中时,更是如此.然而

SQL点滴27—性能分析之执行计划

原文:SQL点滴27-性能分析之执行计划 一直想找一些关于SQL语句性能调试的权威参考,但是有参考未必就能够做好调试的工作.我深信实践中得到的经验是最珍贵的,书本知识只是一个引导.本篇来源于<Inside Microsoft SQL Server 2008>,有经验的高手尽管拍砖把.   这个部分将讲解一些性能分析工具,这些性能分许主要关注在执行计划.   缓存执行计划  SQL Server 2008提供了一些服务器对象来分析执行计划Sys.dm_exec_cached_plans:   

SQL Server数据库性能优化

设计1个应用系统似乎并不难,但是要想使系统达到最优化的性能并不是一件容易的事.在开发工具.数据库设计.应用程序的结构.查询设计.接口选择等方面有多种选择,这取决于特定的应用需求以及开发队伍的技能.本文以SQL Server为例,从后台数据库的角度讨论应用程序性能优化技巧,并且给出了一些有益的建议. 1 数据库设计 要在良好的SQL Server方案中实现最优的性能,最关键的是要有1个很好的数据库设计方案.在实际工作中,许多SQL Server方案往往是由于数据库设计得不好导致性能很差.所以,要实

SQL Server数据库性能优化技术第1/2页_数据库其它

设计1个应用系统似乎并不难,但是要想使系统达到最优化的性能并不是一件容易的事.在开发工具.数据库设计.应  用程序的结构.查询设计.接口选择等方面有多种选择,这取决于特定的应用需求以及开发队伍的技能.本文以SQL  Server为例,从后台数据库的角度讨论应用程序性能优化技巧,并且给出了一些有益的建议.  1 数据库设计  要在良好的SQL Server方案中实现最优的性能,最关键的是要有1个很好的数据库设计方案.在实际工作中,许多SQL  Server方案往往是由于数据库设计得不好导致性能很差

《Access 2007开发指南(修订版)》一一1.11 额外的提示和技巧

1.11 额外的提示和技巧 Access 2007开发指南(修订版) 在操作Access 2007时,有一些额外的提示和技巧值得用户注意.例如高级"导航窗格"技巧和操作多值字段的过程.下面一小节将详细讨论这些话题. 1.11.1 高级导航窗格技巧 Access 2007具备一些值得注意的极好的"导航窗格"技巧,包括创建自定义类别和组的能力,在类别中显示或隐藏组或对象,以及在自定义组中移除和保存对象.下面以创建自定义类别开始介绍,具体操作步骤如下所述: (1)右键单击