DB2

眼前,工作着一个路的多寡 Table 和 Stored Procedure 在 DB2
数据库,需要拜访的。下面将下过程被相遇的几乎个问题整治下:

(说实话,DB2 并没有 SQLServer 好用,也恐怕我是无限小白了,有待于发展
…)

环境搭建

(1)DB2Client

DB2 客户端:DB2 v9.1

设置完成后,可以经过cmd命令行查看 DB2Client 相关新闻:

  • db2level:查看DB2Client版本信,包括32/64位

在起头一贯运行 db2cmd 来运行 db2cmd.exe 启动 db2命令行程序,执行 db2:

中国海洋 1

后来,可以实施连接数据库、访问数等操作。

db2命令行连接数据库

catalog tcpip node runnode_My remote IP server Port
catalog database calldb_Dest as calldb_My at node runnode_My

更任 用户名和登录密码 即可访问数据库了。其中,DB2 数据库默认端口是
50000。

connect to calldb_My user 用户名 using 密码

(2)Quest
Central

DB2 可视化工具:Quest Central for DB2 v5.0.2.4

关于注册码

  • Quest Central for DB2:2-95710-05964-91891-64750 和 Bergelmir/CORE
  • Knowledge Xpert for DB2:147851648424638496327 和 stenny

安后,启动遭逢如下问题:

中国海洋 2

缓解形式:程序上点击鼠标右键–>属性–>兼容性;勾选以配合情势运行此序(兼容windowsXP);勾选以管理员身份运行程序,即可缓解。

具体操作

通过 db2指令 连接到数后,在 Quest Central
首页会显示曾连续的应和数据库的连续结点。

除此之外 Quest Central 外,还发此外 DB2可视化工具,可扩高校习。

基础运用

事先多是用 SQLServer,初次操作 DB2
数据库,虽说语法大多接近,依旧各样非顺手。

有关DB2,相关材料与图书推荐:

  • 牛新庄
    -《循序渐进DB2》《深远解析DB2》《DB2性能调整以及优化》
  • 《DB2 Express-C 连忙入门》

此外,可参考:DB2中国社区

一个服务器能够建造多单实例,一个实例下好建造多独数据库,一个数据库可涵盖多单表明空间。

几乎个注意事项

  • SQL 语句必须要因为 ; 结尾
  • declare 定义变量不要带 @,这是与 SQL Server 的界别
  • SQLSTATE 和 SQLCODE 可以提供 SQL 命令的周转状态
  • 积存过程调用:call ProcedureName(inVal, …, inVal, ?, … ,
    ?);,其中,? 是出口参数占位符
  • NULL
    对于完整性约束与询问带来副功能,指出表中然则好没有空值,在建表时增长非空约束
  • 发明存储于注脚数据空间,索引存储于目数据空间
  • 分区提升系统特性

常用命令

(1)查询

// 查看表字段信息
[1]. describe table schemaName.tableName;
[2]. describe select * from schemaName.tableName;
// 查看表索引信息
[1]. describe indexes for table schemaName.tableName show detail;
[2]. select * from syscat.indexes where tabname='大写的表名';

(2)删除

// 删除索引
drop index schemaName.indexName;

中国海洋,(3)重命名

// 重命名 表名
rename table schemaName.oldTabName to newTabName;
// 重命名 字段
alter table schemaName.TabName
    rename column oldColName to newColName;

里头,表 oldTabName 不要暴发外键约束与视图引用。另外,尽量防止字段重命名。

建表

一度精晓是表 tabSqh,创造 tabSqh 的副本 tabSqh_Copy:

CREATE TABLE tabSqh_Copy like tabSqh;
INSERT INTO tabSqh_Copy select * from tabSqh;

瞩目,该法就复制表结构和表数据,tabSqh_Copy
没有相关的表约束,需要手动添加:

alter table tabName
    add constraint P_tabName primary key(IDKey);
alter table tabName1
        add constraint F_IDKey foreign key (IDKey)
                references tabName2 (IDKey)
on delete restrict on update restrict;        

此外有关约束添加方法而是之。

SELECT 高级用法

此处介绍 select 在 DB2 中之 3 种植高级用法:

(1)复制表结构

CREATE TABLE new_table_name LIKE table_name; 

(2)成立结果注脚

CREATE TABLE new_table_name AS (
    SELECT * FROM table_name
) DEFINITION ONLY; 

(3)创设物化查询表(MQT)

create table new_table_name AS (
    select * from table_name
) data initially deferred refresh deferred;   
refresh table new_table_name; 

物化表SELECT语句看似一个查询,没有真正形成表,类型展现为Query,但她了可以当表来用。 

删表

(1)删除单行数据要批量勾数据:方法2于办法1性好

// 方法1
DELETE FROM tabName WHERE 过滤条件  
// 方法2
DELETE FROM  
(  
    SELECT * FROM tabName WHERE 过滤条件  
);

(3)全表数据删除

// 方法1
DELETE FROM tabName;
// 方法2
DROP TABLE ...
CREATE TABLE ...
// 方法3
ALTER TABLE tabName ACTIVATE NOT LOGGED INITIALLY WITH EMPTY TABLE;

(4)直接删除表

DROP TABLE tabName;

临时表

DB2的临时表基于会话(session),且会说话中相互隔离。当会讲话了时,临时表的多少让删,临时表也会师给删去。

临时表的效用:

  • 保留中间结果集,以便任务之连续处理
  • 免复杂的SQL语句,将同长达较为复杂的SQL语句分解变成多少长度简单的SQL语句,提升运行效能

    // 创制临时表
    DECLARE GLOBAL TEMPORARY TABLE session.TmpTableName
    LIKE rvc.TableName INCLUDING COLUMN DEFAULTS
    WITH REPLACE
    ON COMMIT PRESERVE ROWS
    NOT LOGGED;
    // 向临时表中插数据
    INSERT INTO session.TmpTableName
    SELECT * FROM rvc.TableName WHERE <过滤条件>;

中间,NOT LOGGED 代表未记录日志,WITH REPLACE
表示一旦曾是临时表则替换的,ON COMMIT PRESERVE ROWS
表示commit后仍然保留表中之多少。之后,临时表可以视作是普通表,查询、联表均只是。

有关session临时表的几单问题:http://www.db2china.net/Question/28913

有关session临时表控制选项 ON COMMIT PRESERVE
ROWS的说:http://www.db2china.net/Article/9916

留神,全局临时表允许创制索引、但无同意成立主键和唯一约束。创立的临时表同原表有相同之讲明结构,然则相关列的性能(主键、外键、唯一约束、索引等)信息是绝非底。

旁新闻而参照:DECLARE GLOBAL TEMPORARY TABLE –
IBM

DGTT 与 CGTT

上述临时表均为 DGTT(已声明的大局临时表),DB 9.7 初阶支持CGTT(已开立的全局临时表)。

共同点:

  •  扶助因会话的数额
  •  襄助索引,但非补助唯一约束依旧主键

两头都襄助因会话的数额。

CGTT 优点:

  •  持久化的,在系装置时优先创建、供下共享之,而 DGTT
    是以有平应对中声称、仅供该会话使用;
  •  制止在各种用户会话起始时宣称临时表的求;
  •  采纳和普通表相同的格局规则,而 DGTT 必须是一定的格局 SESSION;

创建 CGTT:

CREATE GLOBAL TEMPORARY TABLE <table_name> (
    <column_name>  <column_datatype>,
    <column_name>  <column_datatype>,
…  )
ON COMMIT [PRESERVE|DELETE] ROWS
ON ROLLBACK [PRESERVE|DELETE] ROWS 
[NOT LOGGED|LOGGED] 
DISTRIBUTE BY HASH ( col1,..)
IN <tspace-name>;

外详细音讯可参考:DB2 临时表 – DGTT 和
CGTT

索引

目录是平稳键值的集合,每一个键值指向表的一行。

目录是相同将双刃剑,当表的目过多时,数据删除、插入和换代频率会骤降,当索引了少或设计不客观时晤面潜移默化多少的询问效用。尽量不要以含蓄
null 值的字段上成立(单列)索引,因为索引不会晤蕴藏该修记下的音讯。

于做索引,指导列(组合索引中排除在极其左侧的排列)对查询语句中where条件的震慑最为要命。因而,应该对索引键中之排本重复值由少及差不多之相继排序,该排序会要索引键提供最佳性能。

优点:

  •  加快查询速度
  •  防止不必要之表扫描 或 排序操作
  •  缩短死锁的发出
  •  唯一性索引保证数据的唯一性

缺点:

  •  额外的积存空间
  •  索引创立同保安的耗时

总结音信

数据库对象的总计参数新闻,如表的数据量大小、占用的页数、表底行数、索引的图景跟各地的分区意况等。

一个SQL在描绘了并运行后,我们只是报DB2去开啊,而未是何许去进行。具体咋样做,取决于优化器。优化器为了转移绝精良的履计划,需要控制当前之连串音讯、目录中的总括音信十分。runstats
命令就之所以来搜集数据库对象的状态音讯,对优化器生成最理想的尽计划要。

本着数据表频繁的insert,
update,会招致数据库存储着冒出物理碎片,runstats可以本着数据库举办数量做,有助于数据块连续化、提高多少存取的频率,原理类似于OS中之磁盘碎片整理。

// 针对表
runstats on table schemaName.tableName;
// 针对表和索引信息
runstats on table schemaName.tableName [with distribution] and [detailed] indexes all;
// 针对某个单一索引
runstats on table schemaName.tableName for/and indexes schemaName.indexName;

施行计划

当干项目数据库调优过程遭到,SQL语句是涉嫌性能问题之要紧由,而行计划虽是分解SQL语句执行进程的语言。

  •  不同数据库里对推行计划的象征方法各不相同
  •  每便导入存储过程,生成的囤过程实行计划不肯定完全相同,受时的数据库参数、总计音信的震慑

SQL语句的进行过程一共包含多少个关键环节:

  •  数据读取格局(scan):表扫描
    or 索引围观
  •  表之间如何开展连续(join):包含Nest
    Loop 、Merge Join、Hash join及半连等、多表间的连年各样选取

至于多表间连接的顺序采纳问题:

无论是在同一条SQL语句被蕴含了小张表连接,同一时刻才出少数张表展开连续,但大多表间的接连各样吧是决定性能的最重要由。数据库对于表的逐一的选,按照五只表达中连续后得出的行数举办排序,即使总结音信和事实上情况不是较丰盛,有或会面招致由于总是各样不当而致使的属性问题。

有关信息请参考:DB2执行计划浅析

于有些复杂的SQL,提议使用
Quest Central 中的 SQL Turning 功用,比较直观。

SQL语句执行计划的旁查看方:

(1)db2expln

db2expln执行计划分为三部分:

  •  当前集执行计划之说话
  •  执行计划详细音讯
  •  执行计划图:从生往上,从左往右,遵照号码从很到小之逐一举行阅读

当cmd命令执行运行 db2expln
命令,可以查看该令的行使辅助。

db2expln -d 数据库名称 -u 用户名 密码 -q "sql语句"[-f "文件名.sql"] -t -o 输出文件名.out

里面,文件名.sql 中之基本上长独立的SQL语句各占1执,行末不要带分号。

db2expln -d dbName -u sqh cmb@2018 -q "sql语句" -g -t -o tmp_sqh.out
db2expln -d dbName -u sqh cmb@2018 -f "sqh.sql" -g -t -o tmp_sqh.out

本着上述命令的表达:

  • -t:输出到巅峰,-o:输出及文件
  • -q:执行一个SQL语句,-f:执行有保存了大半长达SQL语句之公文
  • -g:图形化展现
  • -z:指定SQL语句间的相间符

参考:运 db2expln 的 DB2
SQL性能优化示例

(2)db2exfmt

欠措施要以DB2装目录 …\IBM\SQLLIB\MISC\ 下有 explain.dll
文件,有待于更为深造。

有关查看存储过程的进行计划

率先,获取存储过程相呼应的保证

SELECT bname, bschema, pkgname, pkgschema 
FROM syscat.packagedep
WHERE btype='T' AND pkgname in (
     select bname from sysibm.sysdependencies where dname in (
            select specificname from syscat.procedures where procname='存储过程名称' AND procschema='存储过程模式名称'
     )
);

下一场,再通过如下命令获取包中之行计划

db2expln -d 数据库名称 -u 用户名 密码 -g -c 包模式名称 -p 包名称 -s 0 -t -o tmp_sqh.out

小心,上述代码获取存储过程对应之保,某些处境下询问不至信息,至于为甚还未晓,再提供任何一样种植艺术

select c.PROCSCHEMA, c.PROCNAME, b.* 
from syscat.STATEMENTS b, syscat.PROCEDURES c, syscat.ROUTINEDEP d
where b.pkgname = d.bname
      AND c.SPECIFICNAME = d.SPECIFICNAME
      AND c.PROCSCHEMA   = d.ROUTINESCHEMA
      AND c.PROCSCHEMA   = '存储过程模式名称' AND c.PROCNAME = '存储过程名称'; 

小结的,鉴于数据库存储过程进行计划的多变性,提出:

  •  runstats + rebind
  •  删除重建 

runstats
命令参见上述总括音讯有,上面让闹此外常用命令

// 重新绑定包
rebind package pkgSchemaName.pkgName;
// 更新 package cache 中的执行计划
flush package cache dynamic;

只顾,runstats
仅是改进实施计划之另一方面(对动态SQL生效、但对存储过程无效),另一方面还欲
rebind 包(争持异存储过程举行计划才行)。