![](/img/trans.png)
[英]Retrieving oracle XMLType stored as binary XML from a resultset in Java
[英]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.