将Oracle XMLType存储为BINARY XML时有多大

wol*_*lφi 11 xml sql oracle oracle11gr2

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
Run Code Online (Sandbox Code Playgroud)

因此,vsize似乎是某种指针或LOB定位器的大小,并将getclobval二进制XML解包为文本.但是二进制XML本身的存储大小呢?

请帮忙,表大小为340GB,所以值得研究存储选项......

Thi*_*Jet 12

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'
  ) 
Run Code Online (Sandbox Code Playgroud)

此查询返回看起来像的系统隐藏列名称SYS_NC00002$.

之后,可以通过dbms_lob.getlength()针对隐藏列的常规调用来获取字段的大小:

select dbms_lob.getlength(SYS_NC00002$) from t
Run Code Online (Sandbox Code Playgroud)