您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關如何進行DB2數據庫行長度超限SQL0670N錯誤的案例解析,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
開發人員在修改一個表時,DB2數據庫報SQL0670N錯誤,具體信息如下:
這個錯誤是怎么引起的?又該怎么解決呢?
首先我們看一下DB2數據庫自身對這個錯誤的解釋
這里告訴我們在具有32K頁大小的表空間中,行長度不能超過32677字節。
解決這個問題,我們自然會想到增大行長度限制的表空間的大小或設置較大的pagesize ,當然也可以考慮降低一列或多列的長度來降低行長度。
先查看表空間的具體信息:
$ db2 list tablespaces show detail
表空間標識 = 9
名稱 = TPMS
類型 = 系統管理空間
內容 = 任何數據
狀態 = 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語句或視圖中所引用的最大表數<=存儲器
看完上述內容,你們對如何進行DB2數據庫行長度超限SQL0670N錯誤的案例解析有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。