簡體   English   中英

將Oracle XMLType存儲為BINARY XML時有多大

[英]How big is an Oracle XMLType when stored as BINARY XML

Oracle文檔聲稱它將XMLType存儲為BINARY XML而不是CLOB。 但是如何找出二進制xml占用了多少空間?

CREATE TABLE t (x XMLTYPE) XMLTYPE x STORE AS BINARY XML;

SELECT vsize(x), dbms_lob.getlength(XMLTYPE.getclobval(x)) FROM t;

94 135254
94  63848
94  60188

因此, vsize似乎是某種指針或LOB定位器的大小,而getclobval將二進制XML解包為文本。 但是二進制XML本身的存儲大小呢?

請幫忙,表大小為340GB,所以值得研究存儲選項......

Oracle二進制XML格式對應於“Compact Schema Aware XML Format”,縮寫為CSX。 編碼數據存儲為BLOB字段。 有關Oracle文檔( 此處此處 )提供的二進制XML格式的詳細信息。

數據字段的實際大小取決於XMLType列的LOB存儲參數。 例如,如果啟用storage in row選項,則直接與其他數據一起存儲的小文檔和vsize()將返回適當的值。

實際上,Oracle使用系統名稱創建底層BLOB列,可以通過查詢user_tab_cols視圖找到該列:

select table_name, column_name, data_type 
from user_tab_cols 
where 
  table_name = 'T' and hidden_column = 'YES'
  and
  column_id = (
      select column_id 
      from user_tab_cols 
      where table_name = 'T' and column_name = 'X'
  ) 

此查詢返回系統隱藏的列名稱,其名稱類似於SYS_NC00002$

之后,可以使用常規dbms_lob.getlength()調用隱藏列來獲取字段大小:

select dbms_lob.getlength(SYS_NC00002$) from t

實際存儲消耗存儲在名為user_segments的視圖中。 要查找與列相關的LOB,您必須使用user_lobs加入user_segments:

CREATE TABLE clob_table (x XMLTYPE) XMLTYPE x store as CLOB;

CREATE TABLE binaryxml_table (x XMLTYPE) XMLTYPE x STORE AS BINARY XML;

INSERT INTO clob_table (x) SELECT
  XMLELEMENT("DatabaseObjects",
    XMLAGG(
      XMLELEMENT("Object", XMLATTRIBUTES(owner, object_type as type, created, status), object_name)
    )
  ) as x
FROM all_objects;

INSERT INTO binaryxml_table (x) select
  XMLELEMENT("DatabaseObjects",
    XMLAGG(
      XMLELEMENT("Object", XMLATTRIBUTES(owner, object_type as type, created, status), object_name)
    )
  ) as x
FROM all_objects;

SELECT lobs.table_name,
  (SELECT column_name
     FROM user_tab_cols
       WHERE table_name = lobs.table_name AND data_type = 'XMLTYPE'  AND column_id =
         (SELECT column_id
            FROM user_tab_cols
              WHERE table_name = lobs.table_name AND column_name = lobs.column_name
          )
    ) column_name,
  seg.segment_name, seg.bytes
    FROM user_lobs lobs, user_segments seg
      WHERE lobs.segment_name = seg.segment_name;

TABLE_NAME      COLUMN_NAME SEGMENT_NAME                 BYTES
--------------- ----------- ------------------------- --------
BINARYXML_TABLE X           SYS_LOB0000094730C00002$$  7536640 
CLOB_TABLE      X           SYS_LOB0000094727C00002$$ 19922944 

[代表問題,不允許發表評論]你想說“問題之間”,正如我所理解的那樣。 唯一的相似之處是存儲空間問題,認為它可能有助於“猜測”估計。 您沒有提到要存儲為bXML的數據類型。

將二進制XML解壓縮到文本中

如果是純XML,那么它取決於您將使用的壓縮器。 通常lzma | gzip用於二進制壓縮。 也許我正在寫一些太明顯的事情,但這就是我所知道的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM