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"