設置內聯長度的命令無效
我在表中刪除了一
CLOB(2G) NOT LOGGED
列,並使用相同的大小和LOGGED
屬性重新創建它。如果我看一下,syscat.columns
我發現INLINE_LENGTH
是 0。舊列將此值設置為 312,這是接受的最小值。但是,如果我嘗試使用以下命令設置列的內聯長度,則值不會改變
ALTER TABLE MYSCHEMA.MYTABLE ALTER MYCOLUMN SET INLINE LENGTH 312
該命令成功完成,但顯然內聯長度沒有變化。
以下查詢返回 1 條值為 0 的記錄:
SELECT INLINE_LENGTH FROM syscat.columns WHERE TABNAME='MYTABLE' AND COLNAME='MYCOLUMN'
我希望記錄的值為 312。此外,如果我查看表的 DDL,則沒有 INLINE LENGTH 規範。
我也嘗試在
ADD COLUMN
語句中指定內聯長度,但結果是一樣的。怎麼可能?
這種行為的原因是 DB2 必須為表中行的列中最大可能的 LOB 定位器提供足夠的空間。
INLINE LENGTH 與僅根據數據量使用空間的 VARCHAR 不同。這就像 CHAR - 您指定的大小保留在表的每一行中。
從文件(向下滾動到描述
INLINE LENGTH integer
):對於 LOB 數據類型的列,如果未指定子句,則預設內聯長度設置為 LOB 描述符的最大大小。任何顯式 INLINE LENGTH 必須至少是最大 LOB 描述符大小。
有一個表顯示了各種 LOB 長度的最小顯式內聯長度,對於 CLOB(2G),最大 LOB 定位器大小為 312 字節。
因此,對於您的表,內聯長度必須至少為 312 字節,以確保可以儲存最大可能的 LOB Locator。
奇怪的是,如果我指定的值大於最小值 312(甚至 313),則內聯長度會在 syscat.columns 中正確更新。
無論如何,原因仍然未知。
我嘗試執行以下操作:
- 像以前一樣刪除列
- 重新創建列,但值比以前大一分( 313 )
- 列出內聯長度的值
- 嘗試設置內聯長度的預設值 (312)
結果的內聯長度在第 3 點和第 4 點之後始終為 0。但是在第 4 點我得到了一個錯誤,這似乎很清楚:
SQL20016N: 與列類型關聯的內聯長度值太小
這意味著該值已正確設置為 313,但未在表 syscat.column 中更新該值。
此外,在使用重新創建的列在表上執行 RUNSTATS 後,我看到了以下值:
- ADMIN_IS_INLINED(COLNAME) = 1(表示該列是內聯的)
- PCTINLINED = 100(這意味著 100% 的列是內聯的)
- ADMIN_EST_INLINE_LENGTH(COLNAME) > 0(例如,對於“A comment”,成本為 13 = 9 + 4)
只有在將內聯長度設置為 314 後,該值才會在目錄表中相應更新。