深入理解 Db2 package 的概念和机制(1)
- UID
- 1066743
|
深入理解 Db2 package 的概念和机制(1)
引言最近几个月参与了一些 Db2 性能优化项目,时不时会遇到 Db2 package 相关的问题。回想起前两年遇到的那次银行关键渠道类系统数据库 hang 的问题,最后发现是 package 上竞争导致的。因此认为有必要结合自己的实际经验,把 Db2 package 相关内容梳理一下,也给读者做个参考。
Db2 package 很容易被忽略,但其实无处不在,无论什么编程语言,无论 SQL 类型是动态的还是静态的,都离不开 package。这样一个重要的对象,它也会有锁,也会有竞争,也会影响性能。本文第一部分将介绍 Db2 package 的基本概念,接着逐步讨论各种类型的 package,然后从 Db2 内部机制上理解 package 的作用和重要性,本文的第二部分来介绍 OLTP 系统中可能出现的与 package 相关的问题以及性能优化方法。
本文所讲的 Db2 package 并不是 PL/SQL package,而是指应用程序连接到数据库服务器执行请求时所要用到的 package,例如 CLI package,SQC 程序编译绑定后的 package 等。"package"翻译过来是"程序包",本文仍然使用 package。
准备工作要理解本文的内容,需要我们除了 Db2 基本知识和技能之外,还需要了解一些 Db2 应用程序开发相关的基本知识,了解不同的编程语言连接 Db2 的方式,例如 C/C++使用 CLI 方式,Java 语言的 JDBC 方式,嵌入式 C(.sqc)和嵌入式 Java(.sqlj)使用的嵌入 SQL 方式等,需要了解对于 sqc 文件的编译还额外需要预编译(db2 prep)和绑定(bind)的过程,不过不用担心,本文尽量隐藏这部分的细节,用一种比较简单的方式进行实验。
本文操作过程用了两台 SuSE 12 服务器作为 Db2 服务器和客户端,安装的 Db2 v11.1.3.3,利用 db2sampl 工具创建的 SAMPLE 数据库,并在客户端上进行数据库编目(catalog),如清单 1 所示。如果使用其他操作系统如 AIX 或者 Windows,在使用一些命令或者脚本时可能会比较麻烦。
清单 1. 创建 sample 数据库1
2
3
4
5
6
7
| #服务器端,用实例用户 db2inst1 执行
db2sampl -dbpath /ssddata/DB2/MYDB
#客户端
db2 catalog tcpip node server30 remote 197.3.xx.xx server 60000
db2 terminate
db2 catalog db sample as sample at node server30
db2 terminate
|
Db2 package 是什么Db2 知识中心似乎没有专门介绍 package 相关概念的文档,只是在一些文档零散的提到,结合多个文档的信息我们可以得知,package 是通过绑定(bind)命令,根据绑定文件(bnd 文件)的信息,在数据库中创建的对象;对于嵌入式 SQL 来说,储存的是 SQL 语句被解析编译后的“解释效率更高的操作数字符串”,当应用程序执行的时候 package 中存储的信息将被执行。
这个描述还是很模糊,那再结合一个我们已经都很熟悉的图,如图 1 所示,这是 Db2 编译 SQL 的内部过程,应用程序的 SQL 在 DB2 服务器内大致经过了 SQL 解析、语义检查、重写和优化、生成执行计划等几个过程,最后被 DB2 付诸执行。可被执行的是执行计划,结合起来可以得出这样的结论:Db2 package 中存储的是 SQL 语句的执行计划。
图 1. SQL 编译过程这个结论还是无法让人满意,上述参考的信息更像是嵌入式 SQL 的场景,嵌入式 SQL 还分为嵌入式静态 SQL 和嵌入式动态 SQL,还有非嵌入式的 SQL 例如 CLI 方式、JDBC 方式等,这些不同的类型是否都是一致的 package 机制?
下文将对不同类型的 package 进行探索,如果迫不及待的想看 package 基本知识的总结,可以跳到本文最后的"Db2 package 总结",那儿有个简单的思维导图。 |
|
|
|
|
|