programing

BINARY XML로 저장된 경우 Oracle XML 유형의 크기

newstyles 2023. 7. 28. 21:52

BINARY XML로 저장된 경우 Oracle XML 유형의 크기

Oracle 설명서는 XMLType을 CLOB보다 BINARY XML로 더 압축하여 저장한다고 주장합니다.하지만 바이너리 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 Binary XML 형식은 CSX로 축약된 "Compact Schema Aware XML 형식"에 해당합니다.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_segments를 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 

[재발급, 댓글 달 수 없음] 제가 이해한 대로 "질문 사이"라고 말하고 싶으셨습니다.유일한 유사점은 스토리지 공간 문제입니다. "심각한" 추정에 도움이 될 수도 있습니다.당신은 어떤 유형의 데이터를 bXML로 저장할 것인지 언급하지 않았습니다.

이진 XML을 텍스트로 압축 해제합니다.

순수 XML의 경우 사용할 압축기에 따라 다릅니다.일반적으로 lzma|gzip은 이진 압축에 사용됩니다.내가 너무 뻔한 것들에 대해 쓰는 것일 수도 있지만, 내가 아는 것은 그것뿐입니다.

언급URL : https://stackoverflow.com/questions/24764707/how-big-is-an-oracle-xmltype-when-stored-as-binary-xml