개발을 하면서 성능의 차이가 얼마나 나는지 간단한 테스트를 해봤습니다.

- 조건 : 같은 데이터가 들어 있고 데이터껀수는 911건입니다.
- 네트워크 : 9i설치된 PC에서 테스트 (Local)
- PC사양 : P4-1.6, 512M
- XML 설계에 따른 이슈 : 중요한 요소인데 이 설계 부분은 공개할 수 없기에 생략.
- 방법 : TOAD를 이용하여 SQL을 날리고 그 결과를 TOAD에서 제공되는 결과 속도를 체크.
*편의상 테이블명은 AAA(XMLTable)와 BBB(R)로 한다.


상황1) 칼럼을 하나로 놓고 검색 (20회 반복해서 실행 varchar(20)인)
SELECT extractValue (T.doc,'/MIX/MusicIdentifier/KMID')
FROM AAA T

select kmid
FROM BBB

XMLDB : 100~120 msecs (간혹 큰 숫자 발생)
RDB : 10 msecs

====================================
상황2) 칼럼을 두개로 놓고 검색 (20회 반복해서 실행 varchar(20), varchar2(128)인)

SELECT extractValue(T.doc,'/MIX/MusicIdentifier/KMID'), extractValue(T.doc,'/MIX/Title/OriginalTitle')  
FROM AAA T

select kmid , title
FROM BBB

XMLDB : 200~230 msecs (간혹 큰 숫자 발생)
RDB : 10 msecs

=====================================
상황3) 칼럼을 세개로 놓고 검색 (20회 반복해서 실행 varchar(20), varchar2(128), varchar2(20)인)

SELECT extractValue(T.doc,'/MIX/MusicIdentifier/KMID'),
           extractValue(T.doc,'/MIX/Title/OriginalTitle'),
           extractValue(T.doc,'/MIX/SongDetailInformation/SongMediaInformation/RunningTime')  
FROM AAA T

select kmid , title, runningtime
FROM BBB

XMLDB : 300~320 msecs
RDB : 10 msecs (간혹 20)

=====================================
상황4) 상황3에 WHERE조건으로 검색 추가
SELECT extractValue(T.doc,'/MIX/MusicIdentifier/KMID'),
           extractValue(T.doc,'/MIX/Title/OriginalTitle'),
           extractValue(T.doc,'/MIX/SongDetailInformation/SongMediaInformation/RunningTime')  
FROM AAA T
WHERE extractValue( T.doc,'/MIX/MusicIdentifier/KMID') = '20000520020006'

select kmid , title, runningtime
FROM BBB
WHERE kmid=020000520020006;

XMLDB : 2 secs
RDB : 10 msecs (간혹 20)

==========================================
상황5) 상황3에 WHERE조건으로 검색 추가 (또다른 검색방법)
SELECT extractValue(T.doc,'/MIX/MusicIdentifier/KMID'),
           extractValue(T.doc,'/MIX/Title/OriginalTitle'),
           extractValue(T.doc,'/MIX/SongDetailInformation/SongMediaInformation/RunningTime')  
FROM AAA T
WHERE existsNode( T.doc,'/MIX/MusicIdentifier[KMID="020000520020006"]') = 1

select kmid , title, runningtime
FROM BBB
WHERE kmid=020000520020006;

XMLDB : 2secs
RDB : 10 msecs (간혹 20)

==========================================
상황6) 상황3에 WHERE조건으로 검색 추가 like 검색 (결과값 25개 나옴)
SELECT extractValue(T.doc,'/MIX/MusicIdentifier/KMID'),
           extractValue(T.doc,'/MIX/Title/OriginalTitle'),
           extractValue(T.doc,'/MIX/SongDetailInformation/SongMediaInformation/RunningTime')  
FROM AAA T
WHERE extractValue( T.doc,'/MIX/MusicIdentifier/KMID') like '%20000%'

select kmid , title, runningtime
FROM BBB
WHERE kmid like '%020000%';

XMLDB : 510~550 msecs
RDB : 10~20 msecs

==========================================
상황7) 상황3에 WHERE조건으로 검색 추가 like 검색 + order by 시키기
SELECT extractValue(T.doc,'/MIX/MusicIdentifier/KMID') A,
           extractValue(T.doc,'/MIX/Title/OriginalTitle') B,
           extractValue(T.doc,'/MIX/SongDetailInformation/SongMediaInformation/RunningTime') C
FROM AAA T
WHERE extractValue( T.doc,'/MIX/MusicIdentifier/KMID') like '%20000%'
order by A

select kmid a  , title b, runningtime c
FROM BBB
WHERE kmid like '%020000%';
order by a

XMLDB : 5 secs (5000 msecs)
RDB : 10~20 msecs
==========================================

특이사항
위의 결과는 그래도 '/MIX/Title/OriginalTitle'와 같이 단일 노드(부모자식간)로
구성되었을때 결과는 나오더라도 성능의 차이를 보이는 결과를 가지지만..
아래와 같이..
'/MIX/SongDetailInformation/CorporateInformation/CorporateName'
여기에서 CorporateInformation이 * (0 or 무한대)인 경우를 아래와 같이
검색하면 ...

SELECT extractValue(T.doc,'/MIX/MusicIdentifier/KMID'), extractValue (T.doc,'/MIX/SongDetailInformation/CorporateInformation/CorporateName')
FROM AAA T
WHERE extractValue (T.doc,'/MIX/SongDetailInformation/CorporateInformation/CorporateName') like 'SM기획'
----------------------------------------
ERROR:
ORA-19025: EXTRACTVALUE는 하나의 노드 값만 반환
45 개의 행이 선택되었습니다.
-------------------------------------------
이와 같은 결과를 낸다.

=>
SELECT extractValue(T.doc,'/MIX/MusicIdentifier/KMID'), extractValue (T.doc,'/MIX/SongDetailInformation/CorporateInformation/CorporateName')
FROM doc_xdoclong_km T
WHERE existsNode( T.doc,'/MIX/SongDetailInformation/CorporateInformation[CorporateName="SM기획"]') = 1
이렇게 해결..

============================================
추가1>
SELECT extractValue(T.doc,'/MIX/SongDetailInformation/RightsInformation/RightsType') a,
           extractValue(T.doc,'/MIX/SongDetailInformation/RightsInformation/RightsID') b,
           extractValue(T.doc,'/MIX/SongDetailInformation/RightsInformation/Name') c
FROM doc_xdoclong_km T
로는 값이 나오는데 여기에  ORDER BY 하면
SELECT extractValue(T.doc,'/MIX/SongDetailInformation/RightsInformation/RightsType') a,
           extractValue(T.doc,'/MIX/SongDetailInformation/RightsInformation/RightsID') b,
           extractValue(T.doc,'/MIX/SongDetailInformation/RightsInformation/Name') c
FROM doc_xdoclong_km T
ORDER BY a
----------------------------------------
ERROR:
ORA-19025: EXTRACTVALUE는 하나의 노드 값만 반환
45 개의 행이 선택되었습니다.
-------------------------------------------

==============================================
추가2>
SELECT extractValue(T.doc,'/MIX/SongDetailInformation/RightsInformation/RightsType') as result,
           extractValue(T.doc,'/MIX/SongDetailInformation/RightsInformation/RightsID') b,
           extractValue(T.doc,'/MIX/SongDetailInformation/RightsInformation/Name') c
FROM doc_xdoclong_km T
로 결과 나옴.
그런데 멀티노드가 있는 조건이 붙으면 에러..
- 아래 둘중에 하나 붙으면 에러..
WHERE docid=634

WHERE existsNode(T.doc,'/MIX/SongDetailInformation/RightsInformation[RightsID="01200300073"]') = 1

----------------------------------------
ERROR:
ORA-19025: EXTRACTVALUE는 하나의 노드 값만 반환
45 개의 행이 선택되었습니다.
-------------------------------------------
=============================================
추가>
SELECT extractValue(T.doc,'/MIX/SongDetailInformation/RightsInformation/RightsType') as result,
           extractValue(T.doc,'/MIX/SongDetailInformation/RightsInformation/RightsID') b,
           extractValue(T.doc,'/MIX/SongDetailInformation/RightsInformation/Name') c,
           extractValue(T.doc,'/MIX/Title/OriginalTitle') d
FROM doc_xdoclong_km T
WHERE extractValue(T.doc,'/MIX/Title/OriginalTitle') like '%사랑%'

저작권에서 정보 검색을 위해 사랑이라는 단어가 포함된 검색일 경우
결과가 하나면 제대로 나오고 복수면 ORA-19025에러

---------------------------------------------------------
SELECT extractValue(T.doc,'/MIX/SongDetailInformation/RightsInformation/RightsType') as result,
           extractValue(T.doc,'/MIX/SongDetailInformation/RightsInformation/RightsID') b,
           extractValue(T.doc,'/MIX/SongDetailInformation/RightsInformation/Name') c,
           extractValue(T.doc,'/MIX/Title/OriginalTitle') d
FROM doc_xdoclong_km T
WHERE existsNode(T.doc,'/MIX/Title[OriginalTitle="사랑"]') = 1

이 방식의 경우엔 사랑이라는 단어로의 멀티 결과는 가져오지만,
사랑이 표함된 SQL의 % % 처리를 XPath에서 불가능

SELECT extractValue(T.doc,'/MIX/SongDetailInformation/RightsInformation/RightsType') as result,
           extractValue(T.doc,'/MIX/SongDetailInformation/RightsInformation/RightsID') b,
           extractValue(T.doc,'/MIX/SongDetailInformation/RightsInformation/Name') c,
           extractValue(T.doc,'/MIX/Title/OriginalTitle') d
FROM doc_xdoclong_km T
WHERE existsNode(T.doc,'/MIX/Title[starts-with(OriginalTitle, "사랑")]') = 1
이와 같은 편법도 ORA-19025에러 남..
==============================================




***** 아름다운프로님에 의해서 게시물 복사 + 카테고리변경되었습니다 (2003-12-18 16:49)
Posted by 아름프로
BLOG main image

카테고리

분류 전체보기 (539)
이야기방 (19)
토론/정보/사설 (16)
IBM Rational (9)
U-IT (0)
SOA/WS/ebXML (110)
개발방법론/모델링 (122)
J2SE (34)
J2EE (60)
DataBase (39)
Open Projects (30)
BP/표준화 (50)
Apache Projects (15)
Web/보안/OS (22)
Tools (7)
AJAX/WEB2.0 (1)
Linux/Unix (1)
영어 (0)
비공개방 (0)

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

달력

«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

글 보관함

Total :
Today : Yesterday :