2014-01-23 17 views
0

我們正在DB2數據庫中實現文件上傳和存儲領域。眼下文件上傳列被定義爲BLOB(5242880)如下:在DB2/iSeries中實現BLOB字段的正確方法是什麼?

CREATE TABLE MYLIB.MYTABLE ( 
    REC_ID FOR COLUMN RECID  DECIMAL(10, 0) GENERATED ALWAYS AS IDENTITY ( 
    START WITH 1 INCREMENT BY 1 
    NO MINVALUE NO MAXVALUE 
    NO CYCLE NO ORDER 
    CACHE 20) 
    , 

    [other fields snipped] 

    FORM_UPLOAD FOR COLUMN F00001 BLOB(5242880) DEFAULT NULL , 
    CONSTRAINT MYLIB.MYCONSTRAINT PRIMARY KEY(REC_ID)) 
    RCDFMT MYTABLER ; 

這是這樣做的正確方法?它應該在自己的桌子上還是以不同的方式定義?我有點緊張,它將它顯示爲一個5兆字節的列,而不是指向其他地方的指針,就像SQL Server所做的那樣(例如)。我們會遇到麻煩嗎?

回答

1

除非您指定ALLOCATE子句,否則數據本身存儲在表的「可變長度」(又名「溢出」空間)中。不是其餘行的固定長度空間。

因此,如果您沒有ALLOCATE且文件只有1MB,則只能使用1MB的空間來存儲它,而不是您定義的最大5MB。

注意這意味着系統在訪問這兩個區域的數據時必須執行兩次I/O操作。

數據鏈路具有相同的I/O命中。

從性能的角度來看, - 確保只在需要時纔讀取BLOB。 - 如果說BLOB的90%或更多是說1GB的<,那麼可以通過說ALLOCATE(1048576)來提高性能,但仍然允許存儲全部5MB。第一個1MB將在最後一個4MB的溢出行中。

Charles

+0

但是,「I/O的兩倍」可能不會翻譯兩倍的時間。是的,系統還必須確定記錄溢出部分的位置,但您也正在討論將相當數量的數據庫頁面拉入內存。當您談論5MB數據時,由溢出引起的開銷應該相對較小。 – WarrenT

+0

夠正確。有CPU和磁盤備用的大型系統可能會將固定和可變數據並行。但是在一個小型的單CPU上,你可能會看到I/O轉換幾乎翻了兩倍。 – Charles

+1

我在說的是,引入5MB磁盤頁面的操作將是最耗時的部分,無論是在一個還是兩個部分,溢出所涉及的開銷應該比較小。 – WarrenT

相關問題