개발을 하면서 성능의 차이가 얼마나 나는지 간단한 테스트를 해봤습니다.
- 조건 : 같은 데이터가 들어 있고 데이터껀수는 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)
- 조건 : 같은 데이터가 들어 있고 데이터껀수는 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)