2010-04-14 64 views

回答

5

CLOB的長度是可變的,是的。上限取決於您使用的Oracle版本和數據庫塊大小。對於11G,限制是「DB_BLOCK_SIZE參數的4G *值」(來自11G PL/SQL Language Reference)。 PL/SQL中的VARCHAR2值僅限於32767字節。

我沒有關於PL/SQL中CLOB和VARCHAR2的相對性能的明確信息,並且簡短的Google也沒有返回任何有用的信息。但是,我強烈懷疑VARCHAR2的表現通常比CLOB更好(對於可以存儲在其中的數據),因爲它更簡單。通過使用VARCHAR2編寫一個簡單的程序,並使用CLOB編寫一次簡單的程序,並且每運行1000次並比較總的運行時間,您可以輕鬆設置一個測試來證明這是正確的還是錯誤的。 Tom Kyte的Runstats實用程序在此非常有幫助,並顯示了Oracle資源方面的兩種方法之間的其他差異。

我的建議是:如果你的數據將超過32K,那麼你必須使用 CLOB;如果不是那麼不要使用CLOB,請使用VARCHAR2。

注意:如果CLOB超過VARCHAR2是更好地爲所有尺寸的字符數據,甲骨文將可能deprecate VARCHAR2,因爲他們沒有與長數據類型 - 但他們沒有。

2

與VARCHAR2相比,CLOB實際上更昂貴(更慢)並且更難以使用。如果你不必要地使用CLOB而不是VARCHAR2,那麼你正在遭受可衡量的性能損失。

最後,您應該如前所述,正確使用正確的數據類型。 1)如果您要在數據庫中存儲4000個字節或更少,請使用VARCHAR2,否則使用CLOB。

2)如果您在PLSQL中存儲32k字節或更少,請使用VARCHAR2,否則使用CLOB。

這是關於你所需要的一切。如果您的數據可以超過VARCHAR2限制,則使用CLOB,否則使用VARCHAR2。

至於明確的否定,考慮到在使用任何類型的LOB數據類型時,LOB可以是TEMPORARY(永遠不會存儲在表中的實際行中)或PERMANENT(存儲在表中的實際行中)。如果您在PLSQL中動態構建CLOB並將該CLOB傳遞給JAVA或其他外部客戶端,那麼您已經創建了一個臨時CLOB並將其推送到Oracle數據庫的控制之外。這意味着接受臨時CLOB的代碼現在負責在CLOB完成時釋放該CLOB。您的代碼必須具有可用於此目的的本機環境方法。如果你不這樣做,你的臨時存儲表空間將最終填滿,你的數據庫將停止(停止工作)。它不會崩潰,它只是不起作用。可能需要重新啓動。問題是許多開發工具(例如Java的許多版本)都沒有所需的庫調用。

祝你好運。

0

CLOB變量基本上是指針,所以它們本質上並不慢。問題在於訪問CLOB的內容。根據我的經驗:

  • 依託Oracle的隱含CLOB < - > VARCHAR2轉換往往是
  • 使用dbms_lob程序包是合理的高性能。只是這樣做在一個循環:
    1. 路線從您的CLOB數據塊到緩衝區
    2. 使用從緩衝區中的數據。也許把它轉換成另一塊數據。
    3. 將轉換後的數據塊寫入目標CLOB。
相關問題