db2常用操作整理

DB2数据库整理

  • DB2基础操作
    • 创建db2数据库
    • 数据库启动关闭
    • 数据库连接
  • 数据库配置
    • 日志模式
  • 数据库使用
    • 一些基本方法
    • 基本操作
        • 查询优化-执行计划
        • 查询优化-查询建议
      • 存储过程
      • 函数
    • 进阶使用
      • 1.一条sql实现上下级数据递归查询。(super_pd_id为pd_id上级数据)
      • 2.寄存器使用
      • 3.merge into 使用
      • 4.db2top 优化以及问题查询
  • 数据库基础知识
    • db2隔离级别

更新日志:
2019-5-23 15:12:04 整理部分操作 未完待续
2019-7-1 16:06:07 完善基础操作 增删改 merge into使用等
2019-7-27 20:07:02 db2top 优化以及问题查询 以及执行计划等信息

DB2基础操作

创建db2数据库

//新建数据库

db2 create database <dbname> AUTOMATIC STORAGE YES ON '/dbdata' using codeset utf-8 TERRITORY cn PAGESIZE 8192 RESTRICTIVE

//链接数据库

db2 connect to <dbname>

//创建缓存池

db2 create bufferpool BP_DATA_32K size 209715 pagesize 32k

//创建表空间

db2 "CREATE LARGE TABLESPACE TBS_DATA_32K PAGESIZE 32K MANAGED BY AUTOMATIC STORAGE AUTORESIZE YES EXTENTSIZE 32 PREFETCHSIZE 64 BUFFERPOOL BP_DATA_32K" file system caching

//创建schema

db2 create schema <schemaname>

//设置执行默认schema

db2 set current schema=<schemaname>

//授权 授予dbadm权限

db2 "grant dbadm on database to user \"

//设置归档日志

db2 "update db cfg for \ using NEWLOGPATH \"
db2 "update db cfg for \ using LOGARCHMETH1 DISK:/\"
db2 "update db cfg for \ using TRACKMOD YES"

//释放链接

db2 terminate

数据库启动关闭

#数据库关闭,需等待
db2stop
#启动服务
db2start

数据库连接

#连接数据库
db2 connect to <databasename> user <username> using <password>
#可以在当前session操作中设置默认schema
db2 set currentschema='schemaname'
#释放所有连接,由于异步进行,可能也需要等待
db2 force applications all

数据库配置

日志模式

(归档与循环)
https://blog.csdn.net/xcl168/article/details/14135883

数据库使用

一些基本方法

1.获取数据行号。

SELECT ROW_NUMBER() OVER() AS rowID FROM <tablename>

2.字符串拼接

select 'R'||<columnname> from <tablename>

3.去除空格

select trim(<columnname>) from <tablename>

4.获取字段长度

select length(<columnname>) from <tablename>

5.定位字符位置

select  locate('test',<columnname>from <tablename>

6.截取字符串

select  substr(<columnname>,<begindex>,<strnum>from <tablename>
//从左截取
select  left(<columnname>,<strnum>from <tablename>
//从右截取
select  right(<columnname>,<strnum>from <tablename>

7.时间相关
http://www.cnblogs.com/wanghonghu/archive/2012/05/25/2518604.html

8.查询获取前面几条数据

select top ?
select * from  <tablename> fetch frist 1 rows only

9.替换字符串

select replace(<columnname>,<beforestr>,<afterstr>) from  <tablename>

10.case when

select case when <columnname> is null  then '' else <columnname> end 
from  <tablename>

11.转义
https://www.cnblogs.com/OliverQin/p/5872876.html

基本操作

1.新增、导入表

 create table <tablename>(
   field1 varchar(100),
   field2 char(2),
   field3 timestamp
 )
COMPRESS YES ADAPTIVE
IN "TBS_DATA_32K" INDEX IN "TBS_INDEX_16K"
ORGANIZE BY ROW;
 PS1: 可选用压缩对表进行空间换取 [了解压缩](https://www.ibm.com/developerworks/cn/data/library/techarticle/dm-1205db210compression/)PS2: 设置按列组织表 [了解按列组织](https://www.ibm.com/developerworks/cn/data/library/techarticle/dm-1304whatsnewdb2105/)

#create table by ddl
db2 -tvf ./ddl/tablename.sql -td@
ps:新增函数等 均可以通过导入实现

2.新增注释

COMMENT ON COLUMN "DB"."TABLENAME"."FIELD" IS "字段"

3.新增主键

ALTER TABLE "DB"."TABLENAME" ADD CONSTRAINT "PK_TABLENAME" PRIMARY KEY("FIELD")

4.新增索引

CREATE INDEX "DB"."IDX_TABLENAME_01" ON "DB"."TABLENAME"("FIELD" ASC) COMPRESS YES INCLUDE NULL KEYS ALLOW REVERSE SCANS;
# 加入索引后 最好执行一下runstats 来使索引生效
RUNSTATS ON TABLE TABLENAME WITH DISTRIBUTION AND DETAILED INDEXES ALL
PS: 了解参数 [了解更多](https://www.cnblogs.com/liufei1983/p/9671716.html)

5.新增约束

ALTER TABLE "DB"."TABLENAME" ADD CONSTRAINT "U_TABLENAME" UNIQUE(FIELD1,FIELD2)
PS: 建立约束时注意加入名称,否则可能建立到系统空间,导致的后果删除时报找不到该约束。

6.新增字段

ALTER TABLE TABLENAME
  add column UPDATED_DATE_TIME TIMESTAMP NOT NULL;

PS:时间戳字段在更新数据时自动更新
ALTER TABLE TABLENAME
  add column UPDATED_DATE_TIME TIMESTAMP GENERATED ALWAYS FOR EACH ROW
  ON UPDATE AS ROW CHANGE TIMESTAMP NOT NULL

7.新增字段默认值

ALTER TABLE TABLENAME ALTER COLUMN COLNAME SET DEFAULT ''

8.导入数据

#load data
load from ./data/tablename.dat of del modified by dumpfile=$DUMPPATH/${dt}/tablename.rej coldel0x03 codepage=1386 keeblanks nochardel usedefaults replace into tableschema.tablname NONRECOVERABLE data buffer 10000

#import data
import from ./data/tablename.dat of del modified by colde10x03 codepage='1386' commitcount 10000 replace into tablename

9.导入存储过程

db2 -td@ -vf ./procedures_data.sp

10.创建游标

declare cur_name cursor for select col1,col2 from table1 where table1.id=1

11.创建视图

create view v_tablename(col1,col2) as select col1,col2 from tablename
ps:视图为原表加条件结果集映射,只能用来查询

1.删除数据库

drop database databasename

2.删除表

drop table tablename

3.删除字段

alter table tablename drop column colname
PS请注意。删除字段会导致表不可用,需要reorg表。
reorg table tablename

4.删除约束

alert table <tablename> drop constraint <constraintName>

5.删除方法

drop specific function tableschema.functionname

6.删除存储过程

drop procedure tableschema.functionname

7.删除、清空表数据

#普通删除数据
delete from tablename where id=1
#快速清空表
alter table tablename not lgged initially with empty table
#还可以为表导入个空文件做replace
load from /dev/null of del replace into tablename

8.删除索引

drop index <indexname>

1.更改字段类型

#更改字段类型
alter table tablename alter column colname set data type varchar(1000)

2.更新数据

update tablename set colname='111',colname1='222' where id=1

1.基本查询

select * from tablename where id=1

2.分组查询

# 普通分组
select col1,count(*) from tablename group by col1
# 分组过滤
select col1,col2 from tablename group by col1,col2 having col1='01'

3.with集合查询 可用作递归

#该用法其实可以将特别复杂sql进行降维处理。使其查询逻辑更为简单。
#其中test可作为子查询,并将单个子查询简单化处理。
with test(col1,col2) as(
select co1,co2 from tablename1
),test2(c1,c2)as(
select co1,co2 from tablename2
)
select col1,col2 from test,test2 where test2.c1=test.col1

[了解更多](https://blog.csdn.net/kouge94/article/details/50977801)
#递归使用详见进阶使用中 一条sql实现上下级数据递归查询

4.values 创建虚拟表

# 详见进阶使用 2寄存器

查询优化-执行计划

#创建执行计划需要的表 dbvisual工具查看执行计划需要这些表
windows:C:\Program Files (x86)\IBM\SQLLIB\MISC
linux:/opt/ibm/db2/v10.5/misc
#找到EXPAIN.DDL 并执行
db2 connect to sample
db2  -tvf EXPLAIN.DDL
#或使用
db2 connect to sample
db2 "CALL SYSPROC.SYSINSTALLOBJECTS('EXPLAIN','C',NULL,'DB2INST1')"

#可以直接在db2环境中执行sql进行分析 sql语句用双引号括起来。
#分析程序包
  db2expln -d 数据库名 -i -g -c 模式名-p程序包 -s 0 -t
  db2expln -d 数据库名 -i -g -c 模式名-p程序包 -s 0 -o文件名
#分析sql 语句
  db2expln -d 数据库名 -i -g -q sql语句 -t
  db2expln -d 数据库名 -i -g -q sql语句 -o 文件名
   

查询优化-查询建议

#查询建议需要建立执行计划的表
#建议sql会加入索引,删除无用索引,以及提示 可以查询性能提升多少。
db2advis -d <databasename> -i 1.sql -t 5 -n <schemaname>

存储过程

函数

进阶使用

1.一条sql实现上下级数据递归查询。(super_pd_id为pd_id上级数据)

with tmpselect(pd_id) as(
select pd_id from  \<tablename>
union all
select pdid from  \<tablename> table1, tmpselect table2 where table2.pd_id=table1.super_pd_id
)
select pd_id from tmpselect

2.寄存器使用

SYSIBM.SYSDUMMY1、SYSIBM.DUAL
可以做虚拟数据拼接 如拼接表格数据最后一条合计记录。
select  \<columnname1>, \<columnname2> from   \<tablename>
union all
select '合计',‘0000from SYSIBM.SYSDUMMY1/SYSIBM.DUAL
#也可直接使用values

VALUES
一条sql统计各个表数据量大小
values('tablename1',select count(1) from  \<tablename1> with ur),('tablename2',select count(1) from  \<tablename2> with ur)      

3.merge into 使用

#使用merge into可快速进行数据整合
简单实例如下:
merge into globaltable as t using(select col1,col2 from table1) as s on col1 when matched and s.col3=2 then delete when matched and (s.col3=1 and s.col4=2) then update set t.col1=s.col1,t.col2=s.col2 when not matched and s.col3=4 then insert values(s.col1,s.col2)
#ps:可以在存储过程中动态生成语句进行执行

4.db2top 优化以及问题查询

#db2top 提供了很多功能,可以对当前执行的sql进行查询。
#需要使用实例用户进行执行
db2top -d <databasename> -v <schemaname>
#部分操作说明,
功能 快捷键 功能说明
DateBase d 展示对整个db2数据库性能的监控单元
TableSpace t 展示每个表空间的详细情况
DynamicSql d 展示提供缓存的sql语句的详细信息,对sql执行执行计划 输入大写L 输入sql的hashcode,可以查询完整sql
Session I 展示每个应用程序的会话的详细信息
Bufferpool b 展示每个缓存池的信息
Lock U 展示各个表加锁情况
Table T 展示各个表的信息,展示读取信息
Bottlenecks B 展示瓶颈信息,哪个应用严重限制了系统性能
Agent a 如果界面中展示agentId,可以按a进行查询,会显示出是什么sql

数据库基础知识

db2隔离级别

https://www.cnblogs.com/live-and-learn077/p/5462548.html

你可能感兴趣的:(db2)