DB贰房地产项目

当下,工作中贰个类别的数量 Table 和 Stored Procedure 在 DB2数据库,需求拜访之。上面把施用进程中相见的多少个难点整治下:

(说实话,DB贰 并未 SQLServer 好用,也只怕本身是太小白了,有待于升高…)

环境搭建

(1)DB2Client

DB2 客户端:DB2 v9.1

安装到位后,能够因此cmd命令行查看 DB2Client 相关新闻:

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

在起来平昔运转 db2cmd 来运转 db二cmd.exe 运行 db二命令行程序,执行 db二:

房地产项目 1

随后,能够实施连接数据库、访问数据等操作。

db二命令行连接数据库

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

再凭 用户名和登录密码 即可访问数据库了。个中,DB贰 数据库暗中同意端口是
60000。

connect to calldb_My user 用户名 using 密码

(2)Quest
Central

DB二 可视化学工业具:Quest Central for DB二 v五.0.二.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 外,还有此外 DB贰可视化学工业具,可扩高校习。

基础运用

前边多是用 SQLServer,初次操作 DB贰数据库,虽说语法大多接近,依旧种种不顺手。

至于DB贰,相关资料和书籍推荐:

  • 牛新庄
    -《循途守辙DB2》《深远解析DB2》《DB贰品质调整与优化》
  • 《DB二 Express-C 神速入门》

此外,可参考:DB第22中学夏族民共和国社区

贰个服务器能够建三个实例,3个实例下能够建多个数据库,叁个数据库能够涵盖多个表空间。

几个注意事项

  • 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 中的 三 种尖端用法:

(1)复制表结构

CREATE TABLE new_table_name LIKE table_name; 

(2)成立结果表

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

(叁)创立物化查询表(MQT)

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

物化表SELECT语句看似三个询问,没有当真形成表,类型突显为Query,但它完全能够当表来用。 

删表

(1)删除单行数据或批量删减数据:方法贰比办法①性质好

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

(三)全表数据删除

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

(四)直接删除表

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;
    // 向暂时表中插入数据
    INSELacrosseT INTO session.TmpTableName
    SELECT * FROM rvc.TableName WHERE <过滤条件>;

其中,NOT LOGGED 表示不记录日志,WITH REPLACE
代表若已存在临时表则替换之,ON COMMIT PRESEHummerH二VE ROWS
表示commit后依旧保留表中的数据。之后,暂且表能够看成是普通表,查询、联表均可。

关于session一时半刻表的多少个难题:http://www.db2china.net/Question/28913

关于session近期表控制选项 ON COMMIT PRESE奥德赛VE
ROWS的分解:http://www.db2china.net/Article/9916

专注,全局一时半刻表允许成立索引、但分歧意创造主键和唯1约束。成立的最近表同原表有雷同的表结构,不过相关列的品质(主键、外键、唯壹约束、索引等)消息是从未的。

别的消息可参看:DECLARE GLOBAL TEMPORARY TABLE –
IBM

DGTT 与 CGTT

上述方今表均为 DGTT(已表明的大局暂时表),DB 玖.7 初阶援救CGTT(已创制的全局暂且表)。

共同点:

  •  帮助基于会话的数目
  •  协理索引,但不帮助唯1约束或主键

两边都扶助基于会话的数据。

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条件的影响最大。因而,应该对索引键中的列按重复值由少到多的逐条排序,该排序会使索引键提供最好质量。

优点:

  •  加快查询速度
  •  幸免不需求的表扫描 或 排序操作
  •  减弱死锁的发生
  •  唯一性索引保险数据的唯一性

缺点:

  •  额外的存款和储蓄空间
  •  索引成立和保卫安全的耗费时间

总计音信

数据库对象的总结参数音讯,如表的数据量大小、占用的页数、表的行数、索引的图景和所在的分区情况等。

1个SQL在写完并运行之后,我们只是告诉DB二去做哪些,而不是哪些去做。具体咋办,取决于优化器。优化器为了转移最优的推行安排,须要控制当前的连串新闻、目录中的总结消息等。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语句的执行进程1共包蕴四个关键环节:

  •  数据读取格局(scan):表扫描
    or 索引围观
  •  表之间怎么进行连接(join):包括Nest
    Loop 、Merge Join、Hash join及半再三再四等、多表间的连年各类选拔

至于多表间连接的次第采取难点:

不论是在一如既往条SQL语句中涵盖了不怎么张表连接,同临时刻只有两张表实行连接,但多表间的接二连三各种也是决定质量的机要缘由。数据库对于表的相继的接纳,依照五个表之直接连后得出的行数进行排序,要是计算消息与实情不是较大,有望会造成由于总是各种不当而造成的性质难点。

有关音信请参考:DB二执行安插浅析

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

SQL语句执行陈设的任何查看方法:

(1)db2expln

db贰expln执行布置分为三局地:

  •  当前采集执行陈设的说话
  •  执行安插详细新闻
  •  执行安顿图:从下往上,从左往右,依照号码从大到小的逐1举行阅读

在cmd命令行运营 db二expln
命令,能够查看该命令的应用扶助。

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

里头,文件名.sql 中的多条独立的SQL语句各占一行,行末不要带分号。

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:执行3个SQL语句,-f:执行有些保存了多条SQL语句的公文
  • -g:图形化显示
  • -z:钦点SQL语句间的相间符

参考:选拔 db2expln 的 DB二SQL品质优化示例

(2)db2exfmt

该措施需求在DB二设置目录 …\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生效、但对存款和储蓄进度无效),另1方面还需
rebind 包(对创新存款和储蓄进程举行布置才使得)。

相关文章