nullif('1','1')与nullif(1,1)虽然都返回null,但是两条记录union起来之后该字段只能存放数值类型,或者‘2.5’这种可以强制转化成数字类型的字符串。
2. DB2中 ‘’和‘’或者‘’和‘ ’,是可以匹配的,所以在连接两个表时,一定要注意连接条件中字段是否有‘’、‘ ’,否则会造成笛卡尔积!!!
3. Load 和 import的主要差别
Load Import
大数据移动速度 将格式化的页写入数据库所以更快 慢
4. 在关联两张表的时候尽量on后面只跟关联条件,而且关联条件一定不要带任何函数,例如 sub(a.id,1,4)=b.id(效率非常慢)
5. 关于SUBSTR函数的用法
SELECT SUBSTR(NULL,1,2) FROM SYSIBM.DUAL --这条语句可以返回null。
SELECT SUBSTR('',1,2) FROM SYSIBM.DUAL--而这条语句会报错
原因是因为DB2 NULL、’’的区别,所以在编写程序一定要考虑被截取的字符串是否会为‘’,还有被截取的字符串位数是否>=结果字符串位数
6. 关于user temporary tablespace的使用
创建表不能直接使用这个表空间,可以创建session临时表是可以使用
7.关于DB2的除法。遇到一个很怪异的语句:
SUM (CASE WHEN INDEX_NO = 'NIN0005508' THEN VALUE END)/ SUM (CASE WHEN INDEX_NO = 'GL00003852' THEN VALUE END)计算出来结果只保留整数?!不知道DB2的机制
解决办法:把其中一个转换为double类型。CAST(
SUM (CASE WHEN INDEX_NO = 'NIN0005508' THEN VALUE END) AS DOUBLE)/ SUM (CASE WHEN INDEX_NO = 'GL00003852' THEN VALUE END)
8.drop一张大表的时候,一定要先清空表中数据,再drop
DB2错误和解决方法
1. Lookup Error - : ERROR [57016] [IBM][DB2/AIX64] SQL0668N Operation not allowed for reason code "7" on table "DW.F_HX_CBOD_REACCACC".
解决办法:reorg table DW.F_HX_CBOD_REACCACC;--重组表
其他:runstats on table <tbschema>.<tbname> 收集表 <tbname> 的统计信息。
reorgchk on table all 确定是否需要对表进行重组,对于对所有表自动执行 runstats 很有用。
2. DROP表
有时会遇到这种问题,drop一张表很慢,排除系统表被锁之后,考虑此表是否被其他进程占用。
解决办法:force所有application,重启数据库,这时你会发现表已经被drop掉。(慎用,有可能引起数据库回滚)
3. SQLSTATE 57016: The table cannot be accessed, because it is inactive.
引起的原因:该表可能处于某种pending状态(常常是load pending)
可以通过db2 load query table F_HX_CBOD_LNLNSLNS_H查看load状态,如果处于load pending,则可以通过
db2 load from /dev/null of del terminate into F_HX_CBOD_LNLNSLNS_H来解决(不会清空表)
4.runstats on table dw.xxxx on all columns时遇到一个错误
错误描述:SQL2314W Some statistics are in an inconsistent state. The newly collected
"TABLE" statistics are inconsistent with the existing "INDEX" statistics.
SQLSTATE=01650
SQLSTATE=01650
解决方案:
RUNSTATS
ON
TABLE
DW.XXXX
ON
ALL
COLUMNS
AND
INDEX
ALL
备注:造成这种错误的原因有可能是对表的信息收集和对索引的信息收集不一致。
5.在命令行模式下编译存储过程出现错误
描述:[ODS-DB/home/dw/zj_dir/test]$db2 -td@ -vf zj_test_porc.sql
错误:DB21007E End of file reached while reading the command.
当view进去看的时候没有异常,但是用cat进去看有大量乱码。
原因:字符集问题
解决办法:转码
6.系统重启之后,表空间报错 0x4000
原因:裸设备的挂载和赋权没有设置系统启动自动执行
解决办法:重新绑定和赋权裸设备
(1)绑定: raw /dev/raw/raw1 /dev/sdd1
(2)赋权:chown dw:disk /dev/raw/raw1
(3)重启实例
可以把(1),(2)加到开机启动脚本rc.local中
7.建好一个数据库之后,发现本地可以连接数据库,但是远程连接不上。
原因:本地连接数据库使用IPC(进程间通信),没有配置远程连接协议。
解决办法:在命令行输入
db2set DB2COMM=tcpip或者
db2set DB2COMM=ssl
,然后重启数据库