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
'programing' 카테고리의 다른 글
동적으로 로드된 스크립트에 "crossorigin" 태그를 추가하려면 어떻게 해야 합니까? (0) | 2023.07.28 |
---|---|
사용자 지정 데이터를 사용하여 Oracle Docker 이미지 생성 (0) | 2023.07.28 |
How to create a typedef for function pointers (0) | 2023.07.28 |
이 보안 문제를 해결하는 방법 (0) | 2023.07.28 |
루아에서 줄 쪼개기? (0) | 2023.07.28 |