调优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 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 PROCEDURE 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 和所有定位器代码,并测试结果:

真是令人印象深刻!仅仅通过使用内联 SQL PL 就使所监控代码的运行速度提高了三倍。甚至连不返回结果集的简单 SQL 过程也可以用 SQL 函数取代。对于返回不止一个参数 的过程,可以使用 SQL 表函数,它返回一个包含一行的表 —— 每个输出参数为一列。对于包含一个输出的过程, 可以只使用一个标量 SQL 函数。注意,DB2 V8.2 还支持在 SQL 表函数中包含 UPDATE、DELETE、INSERT 和 MERGE。这意味着 您甚至可以使用内联 SQL PL 封装数据库更改。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索sql
, pl/sql
, 函数
, sql/pl developer
, db2
, mtk
, 内联函数
, 语句
, 游标调优
, pl sql连不上数据库
, pl sql存储过程
, 一个
, 过程
SQL调优
存储过程调优、oracle存储过程调优、sql性能调优培训、sql调优、sql性能调优,以便于您获取更多的相关知识。

时间: 2024-10-01 21:49:10

调优SQL过程的相关文章

我如何调优SQL Server查询

原文:我如何调优SQL Server查询 我是个懒人,我只想干尽可能少的活.当我干活的时候我不想太多.是,你没看错,这看起来很糟糕,作为一个DBA这很不合格.但在今天的文章里,我想给你展示下,当你想对特定查询创建索引设计时,你如何把你的工作和思考过程传达给查询优化器.听起来很有意思?嗯,那就进入我的索引调优世界吧! 有问题的查询 我们来看下列查询: 1 DECLARE @i INT = 999 2 SELECT 3 SalesOrderID, 4 SalesOrderDetailID, 5 Ca

如何调优SQL Server查询_MsSql

在今天的文章里,我想给你展示下,当你想对特定查询创建索引设计时,如何把你的工作和思考过程传达给查询优化器.下面就一起来探讨一下吧! 有问题的查询我们来看下列查询: DECLARE @i INT = 999 SELECT SalesOrderID, SalesOrderDetailID, CarrierTrackingNumber, OrderQty, LineTotal FROM Sales.SalesOrderDetail WHERE ProductID < @i ORDER BY Carri

使用hint来调优sql语句

最近生产发现有一个sql语句运行耗时达5000多秒. 抓出来sql_id一看,sql倒不是一个很长的语句.结构也很简单.如下. select company_code, sap_company_id   from data_company_code  where company_code not in        (SELECT distinct l9_company_code           FROM detailed_data_info_v a, refund_request b  

如何调优SQL Server查询

在今天的文章里,我想给你展示下,当你想对特定查询创建索引设计时,如何把你的工作和思考过程传达给查询优化器.下面就一起来探讨一下吧! 有问题的查询 我们来看下列查询: DECLARE @i INT = 999 SELECT SalesOrderID, SalesOrderDetailID, CarrierTrackingNumber, OrderQty, LineTotal FROM Sales.SalesOrderDetail WHERE ProductID < @i ORDER BY Carr

调优IBM DB2 UDB SQL存取路径

简介 Visual Explain 是 IBM DB2 Universal Database 中的杰出工具,程序员和 DBA 用它来详细说明 DB2 优化器为 SQL 语句所选择的存取路径.事实上,Explain 应该是您性能监控策略的 关键组件.Explain 为解决许多类型的性能问题提供了价值无法估量的信息,因为它提供这样的细节: DB2 在"幕后"所做的工作,以实现 SQL 请求的数据需求 DB2 是否使用可用的索引,如果使用,DB2 如何使用它们 为满足连接条件而访问 DB2

JVM调优浅谈

[本文转载自JVM调优浅谈] 1.数据类型     java虚拟机中,数据类型可以分为两类:基本类型和引用类型.基本类型的变量保存原始值,即:它代表的值就是数值本身,而引用类型的变量保存引用值."引用值"代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置.     基本类型包括:byte.short.int.long.char.float.double.boolean.returnAddress     引用类型包括:类类型.接口类型和数组 2.堆与栈  

《大规模Java平台虚拟化与调优》——1.3 大规模Java平台的技术因素

1.3 大规模Java平台的技术因素 当设计大规模Java平台时,需要考虑很多的技术因素.例如,对于构建良好的大规模Java平台来说,需要很好地理解Java垃圾回收(garbage collection,GC)以及JVM架构.硬件和hypervisor架构.本节中,概要讨论了GC.非一致内存架构(Non-Uniform Memory Architecture,NUMA),以及在理论和实际操作中的内存限制.稍后的章节会给出更为详细的描述,但首先在整体上理解围绕大规模Java平台设计有哪些问题是非常

SQL SERVER调优常用方法

说起SQL SERVER的调优,我想大伙也很想知道这方面的知识.本人也正在探索的路上,大家有什么好 的意见,欢迎一起探讨.研究.博取众人之长,才能扬长避短. 本文中的内容主要是摘自<程序员的 SQL金典>,如若大家想拜读,可在网上下载拜读(当然最好的方式还是购买作者的书). 关于调优 的方案,有涉及硬件方面的知识,也有涉及软件方面的知识.但本人只是个软件方面的IT男,所以只是 记录软件方面的内容. 其实关于SQL SERVER或者是其它数据库来讲,有些优化手段都是一致的.比如 常规的方式有如下

《T-SQL性能调优秘笈——基于SQL Server 2012 窗口函数》——1.1 窗口函数的背景

1.1 窗口函数的背景 T-SQL性能调优秘笈--基于SQL Server 2012 窗口函数 在开始学习具体的窗口函数之前,先了解其背景和内涵,会对后续的学习有所帮助.本节先谈谈窗口函数的背景,解释基于集合方式和基于游标/迭代方式进行查询的不同,以及窗口函数如何对二者的差异进行弥补.最后,本节也提到了窗口函数的替代方法,以及为什么窗口函数会优于其替代方法.注意,尽管窗口函数能非常高效地解决很多问题,但在某些案例中,替代方法会好于窗口函数.第4章会具体谈论对窗口函数的优化,解释在什么情况下,计算