vsize vs lengthB 0 4 665

by 주니 [Oracle 기초] vsize lengthB [2021.01.19 18:02:01]


안녕하세요. 

아래에 두 함수에 대해서 의문이 생겨서 문의 드립니다.

VSIZE : 문자, 숫자, 날짜 byte 

LENGTHB : 문자 Byte

로 오다가다 설명을 들었습니다.

그런데 아래 퀴리문을 진행해 보니 두개에 경우가 다릅니다. 

참고로 PV_MSG 컬럼은 XMLTYPE 입니다.

SELECT * FROM TABLE1
  WHERE VSIZE(PV_MSG) < 4000;

Result => 정상적으로 출력...

 

SELECT * FROM TABLE1
  WHERE LENGTHB(PV_MSG) < 4000;

SQL Error [19011] [72000]: ORA-19011: 문자열 버퍼가 너무 작음

by 마농 [2021.01.19 18:31:04]

vsize 는 해당 항목 본연의 저장된 사이즈를 구하는 것이고
vsize 의 인자로 xmltype 도 처리가 가능한 모양이네요.
lengthb 는 문자의 사이즈를 구하는 것인데.
lengthb(xml) 을 하게 되면 xml 을 1차적으로 문자로 변환하여 처리해야 하죠.
문자로 변환하는 과정에서 버퍼 오류가 나는게 아닐까? 생각되네요.


by 주니 [2021.01.20 10:12:57]

답변에 감사드립니다.

몇가지 질문을 더 드리고 싶습니다.

1. "vsize 는 해당 항목 본연의 저장된 사이즈..." 라는 답변에서 "항목" 즉 "컬럼"으로 읽혀지는 "본연의 저장된 사이즈" 즉 "실제 저장된 데이터 사이즈" 라고 이해하면 될까요?

2. lengthb(xml) 문자열 변환처리란? xml 시작부터 끝까지 구성되어 있는 문법적 기호들까지 문자열로 변환한다고 이해를 하면 될까요?

이렇게 질문글을 쓰다 보니 한가지 더 드는 생각이 그럼 1 번에 경우 xml 구조에서 스칼라값만 사이즈를 인식한다는 뜻인가 하는 의구심이 듭니다.

이러한 생각에 이르게 된 이유는 현재 oracle xmltype 을 altibase varchar(32000) 으로 마이그레이션을 진행하였으나
데이터 마이그레이션이 되지 않고 오류가 발생한데에서 드는 의문입니다.
**참고로 oracle xmltype 컬럼에 대해서 vsize 로 select 해 보면, 4007 byte 가 제일 큰 사이즈 데이터 입니다.

바로 직전에 의문은 oracle 이 아니므로 꼭 답변을 듣고자 덮붙여 쓴 내용은 아니고, 이와 같은 스토리가 있다보니, "1 번에 경우 xml 구조에서 스칼라값만 사이즈를 인식한다는 뜻인가 하는 의구심이 듭니다." 라는 얘기를 드리는 겁니다.

3. 끝으로 이와 같이 대용량에 실제 사이즈를 확인 할 수 있는 방법을 찾고 있습니다만, 아직 찾지 못했습니다.
예를 들어 xmltype 컬럼 내에서 제일 큰 사이즈에 데이터에 사이즈가 얼마인가를 알 수 있을까요?
알 수 있다면 방법을 공유해 주실 수 있으실까요?

 


by 마농 [2021.01.20 10:58:10]

XML Type 의 문자열 변환에 대한 부분은 추측성 답변입니다.
XML Type 이 내부적으로 어떤 형태로 저장되고 변환되는지는 모릅니다.
다만, 저는 이 오류에 대해서 XML 에 주목하지 않고 LENGTHB 함수에 주목했습니다.
LENGTHB 함수가 필요로 하는 입력값은 문자입니다. 원래는 다른 타입이 들어오면 안되는 거죠.
다른 타입이 들어왔는데 타입 에러가 아닌 문자버퍼 오류가 난 부분에 주목한다면?
묵시적 형변환이 이루어 졌음을 미루어 짐작할 수 있습니다.

WITH t AS
(
SELECT XMLTYPE('<xml>xml</xml>') x FROM dual
UNION ALL SELECT XMLTYPE('<x>x</x>') FROM dual
UNION ALL SELECT XMLTYPE('<html>html</html>') FROM dual
)
SELECT x
     , VSIZE(x)   v_s
     , LENGTHB(x) l_b
  FROM t
;
-- Result --
22, 14
16,  8
25, 17
-- 테스트 결과를 분석해 보면
-- lengthb : 저장된 xml 구문의 문자길이
-- vsize : lengthb + 8

 


by 주니 [2021.01.20 11:38:57]

답변에 감사 드립니다.

예제로 설명해 주시니 좀 더 이해하기 좋았습니다.

그런데 vsize 는 xml 구문을 몇 byte 읽고 있는지 헤아려 보려고 해도 잘 모르겠습니다.
그리고 이전 문의 드렸던 부분 중 특정 컬럼에 데이터 사이즈를 알 수 있는 방법은 없을지 문의를 드리면 마무리 할까 합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입