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本身的存储大小如何?
vsize
getclobval
请帮助,表大小为340GB,因此值得研究存储选项…
Oracle二进制XML格式对应于缩写为CSX的“紧凑型模式感知XML格式”。编码数据存储为BLOB字段。有关二进制XML格式的详细信息,可从Oracle文档中获得(此处和此处)。
数据字段的实际大小取决于XMLType列的LOB存储参数。例如,如果storage in row启用了该选项,则小型文档将直接与其他数据一起存储并vsize()返回适当的值。
storage in row
vsize()
实际上,Oracle使用系统名称创建底层的BLOB列,可以通过查询user_tab_cols视图找到该列:
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$。
SYS_NC00002$
之后,可以通过dbms_lob.getlength()对隐藏列的常规调用来获取字段的大小:
dbms_lob.getlength()
select dbms_lob.getlength(SYS_NC00002$) from t