¿Qué tan grande es un XMLType de Oracle cuando se almacena como XML BINARIO?

La documentation de Oracle afirma que almacena XMLType más compacto como XML BINARIO que como CLOB. ¿Pero cómo averiguo cuánto espacio toma el xml binary?

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 

Entonces, vsize parece ser del tamaño de algún tipo de puntero o localizador LOB, y getclobval el XML binary en text. Pero, ¿qué hay del tamaño de almacenamiento del XML binary?

Por favor, ayuda, el tamaño de la table es de 340 GB, por lo que vale la pena search en las opciones de almacenamiento …

El formatting XML binary de Oracle corresponde a "formatting XML compatible con esquema compacto" abreviado como CSX. Datos codificados almacenados como campo BLOB. Detalles sobre el formatting XML binary disponible a partir de la documentation de Oracle ( aquí y aquí ).

El tamaño real del campo de datos depende de los parameters de almacenamiento LOB de la columna XMLType. Por ejemplo, si la opción de storage in row activada, los documentos pequeños almacenados directamente con otros datos y vsize() devuelve los valores apropiados.

En realidad, Oracle crea una columna BLOB subyacente con el nombre del sistema, que se puede encontrar consultando la vista 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' ) 

Esta consulta devuelve el nombre de la columna oculta del sistema que se parece a SYS_NC00002$ .

Después de eso, es posible get el tamaño de los campos con la llamada regular de dbms_lob.getlength() contra la columna oculta:

 select dbms_lob.getlength(SYS_NC00002$) from t 

El consumo de almacenamiento real se almacena en una vista llamada user_segments. Para encontrar el LOB correlativo a la columna, deberá unir user_segments con user_lobs:

 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 

[número de representante, no se le permitió publicar comentarios] quería decir "entre preguntas", tal como lo entendí. la única similitud es el problema del espacio de almacenamiento, que podría ser útil para la estimación de "conjeturas". no mencionó qué tipo de datos va a almacenar como bXML.

descomprime el XML binary en text

Si es XML puro, entonces depende de qué compresor va a utilizar. Por lo general, lzma | gzip se usa para la compression binaria. Tal vez estoy escribiendo sobre cosas demasiado obvias, pero eso es todo lo que sé

Intereting Posts