db2&unix使用总结(三)


1、Merge的用法:

MERGEINTO employee AS e

USING(SELECT empno, firstnme, midinit, lastname, workdept,

phoneno,

hiredate,job, edlevel, sex, birthdate, salary FROM my_emp) AS m

ONe.empno = m.empno

WHENMATCHED THEN

UPDATESET (salary) = (m.salary)

WHEN NOTMATCHED THEN

INSERT(empno, firstnme, midinit, lastname, workdept, phoneno,

hiredate,job, edlevel, sex, birthdate, salary)

VALUES(m.empno, m.firstnme, m.midinit, m.lastname,

m.workdept,m.phoneno, m.hiredate, m.job, m.edlevel,

m.sex,m.birthdate, m.salary)

使用表my_emp 联合表employee,根据两个表的比照(ONe.empno =m.empno),如果存在这样的记录,则使用表my_emp 的salary 值来更新表employee 的salary 的值;如果不存在符合条件的记录,则将表my_emp 中的数据插入到表employee 中去。可以理解为先更新数据,更新不了就插入数据。

假设您想在同一个工作单元(UOW)中给职员000220 加薪7% 并检索她原来

的工资。可以使用数据修改-表引用子句来实现,这个子句是SQL 语句中FROM

子句的一部分。

SELECT salaryFROM OLD TABLE (

UPDATE employeeSET salary = salary * 1.07

WHERE empno = '000220');


2.      脚本运行方式:

DB2 -td@ -vfC:\sales_status.db2

说明:db2 命令指定-td 选项标志,这让命令行处理程序使用@ 作为

语句终止字符(因为在过程体内已经使用分号作为语句终止字符);-v 选项标

志让命令行处理程序将命令文本回显到标准输出;-f 选项标志让命令行处理程

序从指定的文件(而不是标准输入)读取命令输入。


3、数据库并发性相关:

select 。。。for update语句将锁住查询结果中的元组,这些元组将不能被其他事务的UPDATE,DELETE和FOR UPDATE操作,直到本事务提交

select 。。。with ur 设置隔离级别为未提交可读。


4、关于跨库导数据库:

首先得到建表ddl,db2look -d SAMPLE -z DB2INST1 -e -o sample.ddl -i db2inst1 -wdb2inst1

生成导出数据语句:db2 "select 'export to ' || rtrim(tabname) || '.ixf of ixfselect * from ' || rtrim(tabname) || ';' from syscat.tables where tabschema ='DB2INST1'" > export.sql

简单编辑下。

生成导入数据语句:db2 "select 'load from ' || rtrim(tabname) || '.ixf of ixfinsert into ' || rtrim(tabname) || ';' from syscat.tables where tabschema ='DB2INST1'" > load.sql

执行三个脚本。


5、查看执行计划:

可以用客户端工具直接看,也可以创建执行计划表:

db2 -tvf $HOME/sqllib/misc/EXPLAIN.DDL

生成执行计划并入库:db2 "EXPLAIN PLAN FOR selectstatment"

   或者:db2 set current explain mode explain

         db2 -tvf merge.sql

         db2 set explain mode no

         db2exfmt -db bssdb -g TIC -w -1 -n %-s % -# 0  -o merge2.txt //格式化输出

查看执行计划:SELECTO.Operator_ID, S2.Target_ID, O.Operator_Type,

S.Object_Name,CAST(O.Total_Cost AS INTEGER) Cost

 FROM EXPLAIN_OPERATOR O

LEFTOUTER JOIN EXPLAIN_STREAM S2

ONO.Operator_ID=S2.Source_ID

LEFTOUTER JOIN EXPLAIN_STREAM S

ONO.Operator_ID = S.Target_ID

ANDO.Explain_Time = S.Explain_Time

ANDS.Object_Name IS NOT NULL

 ORDER BYO.Explain_Time ASC, Operator_ID ASC

直接在终端输出:db2expln -d zjbi2 -u bi pwd -t -f 2.sql

db2expln -d zjbi2 -u bi pwd-t -q "select * from syscat.tables "

设置优化级别:db2 set currentquery optimization [0|1|2|3|5|7|9] 默认是5

使用db2advis查看单条SQL语句建议:

db2advis -d zjbi2 -i 1.sql               //1.sql里写sql语句

查看语句运行的时间:time db2 "select count(*) from dw_user_d_201106"


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值