Db2

設置內聯長度的命令無效

  • August 22, 2016

我在表中刪除了一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 中正確更新。

無論如何,原因仍然未知。

我嘗試執行以下操作:

  1. 像以前一樣刪除列
  2. 重新創建列,但值比以前大一分( 313 )
  3. 列出內聯長度的值
  4. 嘗試設置內聯長度的預設值 (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 後,該值才會在目錄表中相應更新。

引用自:https://dba.stackexchange.com/questions/146390