1. db2 nullif()
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
解決方案: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 ,然後重啓數據庫