DB2數據庫SQL0670N錯誤(行長度超限)案例解析

  開發人員在修改一個表時,DB2數據庫報SQL0670N錯誤,具體信息以下:數據庫

164703641.jpg

  這個錯誤是怎麼引發的?又該怎麼解決呢?ide

  首先咱們看一下DB2數據庫自身對這個錯誤的解釋性能

165220662.jpg

  這裏告訴咱們在具備32K頁大小的表空間中,行長度不能超過32677字節。spa

  解決這個問題,咱們天然會想到增大行長度限制的表空間的大小或設置較大的pagesize ,固然也能夠考慮下降一列或多列的長度來下降行長度。blog

  先查看錶空間的具體信息:索引


$ db2  list  tablespaces  show detail內存


表空間標識                          = 9開發

名稱                                = TPMSget

類型                                = 系統管理空間it

內容                                = 任何數據

狀態                                = 0x0000

  詳細解釋:

    正常

總計頁數                            = 2084

可用頁數                            = 2084

已用頁數                            = 2084

未用頁數                            = 不適用

高水位標記(頁)                    = 不適用

頁大小(以字節計)                  = 32768

擴展數據塊大小(頁)                = 32

預取大小(頁)                      = 32

容器數                              = 1


pagesize的值已經比較大了,能夠考慮增大表空間。

DB2現有表空間擴容的方法
1)直接添加一個容器的例子:

db2 " ALTER TABLESPACE TPMS ADD (DEVICE '/dev/rhdisk9' 10000) "
加容器以後DB2會有一個自動balance的過程,可能會持續幾個小時!!!  在線作有必定風險!

2)改變現有容器的大小(該方法不會觸發balance,但若是表空間創建在裸設備上,則要擴衝裸設備空間):

db2 " ALTER TABLESPACE TPMS RESIZE (FILE '/conts/cont0' 2000, DEVICE '/dev/rcont1' 2000, FILE 'cont2' 2000) "

注意這種方式就是將原有的相應容器都改爲大小是2000頁


或者考慮下降一列或多列的長度來下降行長度。

例如:執行的SQL語句爲

alter table tpms.tpms_target alter column "target_value_by" set data type varchar(4000);

若是報錯,能夠設一個小點的值varchar(2000),這樣就執行成功了。若是2000還放不下,能夠分紅兩個表,主鍵、字段;主鍵、其餘字段


varchar類型的最大長度爲8000,若是有更大的數據,還能夠考慮long varchar或clob類型。


最後本例中的報錯是經過設置CLOB類型解決的。

alter table tpms.tpms_target alter column "target_value_by" set data type clob(4000);


補充:varchar的最大長度是由DB2的表空間決定,在DB2中一行數據的大小不能超過表空間的pagesize。而clob,dbclob和blob大小爲2GB。


通常來講,爲了提升性能,數據庫須要專門建立一個用於存放大字段的表空間,數據表的大字段列應該將數據存放於對應的表空間中,這是由於不通過內存(緩衝池)直接讀取的。


DB2的限制
1. 一個表的最大列數<=1012
2. 一個視圖的最大列數<=5000
3. 一行的最大長度(字節)<=32677
4. 每一個分區中表的最大尺寸(千兆字節數)<=512
5. 每一個分區中索引的最大尺寸(千兆字節數)<=512
6. 每一個分區中表的最大行數<=4000000000
7. 最長索引關鍵字(字節數)<=1024
8. 一個索引關鍵字中的最大列數<=16
9. 一個表的最大索引數<=32767或存儲器
10. 一個SQL語句或視圖中所引用的最大表數<=存儲器

相關文章
相關標籤/搜索