database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 22270 게시물 읽기
No. 22270
통계 쿼리 속도 vs. 대체 방법론.. 다른게 없을까요?
작성자
김연혜
작성일
2005-04-08 09:20ⓒ
2005-04-08 09:23ⓜ
조회수
3,331

2개의 트리 구조 형태를 표현하는 데이터와 1개의 대량의 데이터를 포함하는 테이블을 가지고 있습니다.

A : tree 형태

 

A_ID A_NAME A_PATH A_UPPER
1 a_1 01
2 a_2 0101 1
3 a_3 0102 1


B: tree 형태

 

B_ID B_NAME B_PATH B_UPPER
1 b_1 01
2 b_2 0101 1
3 b_3 0102 1


C: 대량 데이터

 

C_ID C_NAME A_ID(FK) B_ID(FK)
1 c_1 1 2
2 c_2 2 3
3 c_3 1 1


 

원하는 데이터 형식.

 

1(A - 조건A)
2 3 합계
1(B - 조건B) 2 0 0 0
3 1 0 1
합계 1 0 1


 

** 쿼리형태

SELECT
A_NAME, A_ID, B_NAME, B_ID
,( SELECT COUNT(C_ID)
FROM C ai, B ci, A oi
WHERE ai.B_ID= ci.B_ID AND ai.A_ID = oi.A_ID
AND LENGTH(ci.B_PATH) >= LENGTH(c.B_PATH)
AND SUBSTR(ci.B_PATH, 1, LENGTH(c.B_PATH)) = c.B_PATH
AND LENGTH(oi.A_PATH) >= LENGTH(o.A_PATH)
AND SUBSTR(oi.A_PATH, 1, LENGTH(o.A_PATH)) = o.A_PATH
) VALUE
FROM B c
, A o
WHERE c.B_UPPER = ?(조건B) AND o.A_UPPER = ?(조건A)
ORDER BY o.A_PATH, c.B_PATH

 

order by를 안한다고 하더라도 그리 성능이 나타나지 않는 관계로 자문을 구합니다.

sql을 이용하는 이유는 위와 같이 조건 A, B가 가변적이기 때문입니다.

 

이와 같은 통계 데이터를 출력하는 방법론 또는 쿼리 속도에 대한 향상법을 알고싶어 질문을 드립니다.

저 쿼리 속도를 가지고서는 당장(웹) 응답속도가 제대로 나오지 않는 관계로

다른 방법론(PL-SQL, 로직 프로그램 기타등등) 이 있으시다면 작은 힌트라도 던져주시면 잽싸게 주어듣겠습니다. (멍멍~)

이 글에 대한 댓글이 총 5건 있습니다.

AND LENGTH(ci.B_PATH) >= LENGTH(c.B_PATH)
AND SUBSTR(ci.B_PATH, 1, LENGTH(c.B_PATH)) = c.B_PATH

조건에서 저게 왜 필요한건지 모르겠네요...

SUBSTR(ci.B_PATH, 1, LENGTH(c.B_PATH))  의 결과는 결국 ci.B_PATH 하고 똑같은데 굳이 SUBSTR을 할 필요가 있나요?

그냥 ci.B_PAHT = c.B_PATH 랑 똑같을거 같은데...

 

nomadism님이 2005-04-08 10:22에 작성한 댓글입니다. Edit

FROM 절에서

C1 이 대용량이면 FROM 절 순서가...

FROM C ai, B ci, A oi  => FROM B ci, A oi, C ai

로 해야..작은것부터 스캔을 해서 가져오지 않을까요?

 

그리고 어차피 substr 을 인덱스칼럼에 해주면

Full Scan을 하니까...늦어지겠죠

 

개바리님이 2005-04-08 10:35에 작성한 댓글입니다. Edit

substr을 하는 이유는 하위의 것들 모두 가져와야 하는 겁니다.

트리 형태이므로  A_ID 1 하위에는 2, 3이 있고 2, 3 밑에는 각각 자식, 자손 노드들이 붙게 되겠죠.

 

여기서 통계 내는 것은 그거에 한정된 것이 아니라

그 하위에 붙어 있는 모든 C의 합계입니다. (A_ID = 2 & A_ID = 2의 자손) 따라서 A_PATH를 통해서 하위 노드들 것을 포함하는 것이기때문에 substr을 씁니다.

 

만약 자손을 통계치를 포함시키지 않는 다면 그런 조건이 필요하지 않겠죠

 

답변 주신 분들 감사합니다. 그리고 질문에서 하위를 포함하는 통계치를 낼 때라는 조건을 걸지 않아서 죄송합니다. ^^;;;

김연혜님이 2005-04-08 10:48에 작성한 댓글입니다. Edit

음...

먼저 아주 재미있는 문제에 도전하고 계신데 대하여 격려의 말씀을 드리구 싶구요....

대부분의 OLAP 도구나 ROLAP 도구등에서 스타 스키마나 스노우플레이크 스키마를 지원하지만....

BOM과 같은 가변깊이의 자기참조 트리구조를 지원하지 않는 이유가 님이 부딪치신 문제와 동일한 문제 때문입니다....

 

먼저 주어진 문제를 현업과의 협의를 통하여 단순화하는데 그 촛점을 맞추셔야 합니다.

 

님의 요구사항은 문제만 단순해진다면 오라클의 cube 같은 것으로 해결이 가능합니다.

 

님이 부딪친 문제중 가장 큰 문제는 합계를 보여주어야하는 부분의 깊이가 가변이라는 점입니다.

거기에 중간 소계를 더한다면 ....

문제의 성격상 가로 및 세로의 타이틀 부분만도 상당히 두꺼워 질 것입니다.

그리구 웹에서 보여준다면... 동적으로 table을 구성할텐데요....

이거 로직도 만만치 않을것입니다.

 

아마도

순수 예제 테이블 형태로 질문을 올리시기 보다.

진짜 업무 테이블로 올리시고 다른 분들께 더욱 폭넓게 문제에 접근할 수 있는 기회를 주시는 것이 ....

더 많은 고민과 그에 합당한 해결책을 찾을 수 있는 길이리라 생각합니다.

 

저 같은 경우

 

님과 비슷한 테이블 레이아웃의 설계를 ...

아예 설계 자체에서 가능한 배제시키던가

아니면 현업과의 협의를 통해... 가능한 레벨에서의 조회로 문제를 축소시키고

더 깊을 레벨로의 조회는 한단계 더 깊이 들어가는(drill-down)하는 형태로 어플리케이션을 구축합니다.

 

우리가 생각할때...

논리적으로 보아서는 무한개의 깊이가 있을 수 있는 트리도...

대부분의 현실 업무에서는 4~5레벨 깊이 이상은 들어가는 일이 거의 없고.. 대부분은 3레벨이 최고가 되기 쉽습니다.

그 이유는

궁극적으로 이 프로그램을 사용하여 데이타를 조회하는 인간의 능력이 ... 그 이상의 레벨 깊이로 내려가면 .... 보는것도 힘들고 의미를 파악하기도 불가능하다는 것입니다.

결국 그러한 통계는 이미 의미를 상실하기 때문에.....

현업과 잘 협의만 하면....

문제의 해결을 다른 방향으로 생각할 수 있습니다.

통계적 조회의 목적은 데이타의 가능한 분석을 가능하게하는 요약보고라는 점임을 잊지 않는다면....

데이타의 가공을 고정깊이의 트리로 바꾸고....SQL을 단순화 한 다음...

추가적 조회는 drill-down을 통해 다단계화하는 방법을 모색하시기 바랍니다.

 

제가 이렇게 주저리주저리 떠드는 것이 님을 짜증나게 할 수도 있습니다.

왜냐면 지금 나는 당장 이걸 해결하는게 급한데.. 무슨 헛소리냐고...

그러나 잘 생각해보면 기술적으로 완벽하고 누구도 따라할 수 없는 최상의 SQL로 만든 프로그램이어도 사용자가 보기어려우면 이미 필요없는 프로그램이 되기 때문입니다....

제일 먼저 고려할 것이 이것입니다.

김흥수(protokhs)님이 2005-04-10 23:35에 작성한 댓글입니다.
이 댓글은 2005-04-10 23:38에 마지막으로 수정되었습니다.

김흥수님 자세한 의견에 대해서 감사드립니다.

데모 수행 중이라 이제야 발견했습니다.

 

좋은 말씀 감사드립니다.

(절대 잔소리로 안 들었습니다. ^^) 

 

 

김연혜님이 2005-04-11 12:08에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
22273SYS로 Login할려는데요... [1]
궁금이~
2005-04-08
1638
22272A테이블과 공통코드 테이블 간의 조인 질문 [1]
이재선
2005-04-08
2749
22271테이블 제거후 이상한 테이블이 생겼네요. [2]
작성자
2005-04-08
1193
22270통계 쿼리 속도 vs. 대체 방법론.. 다른게 없을까요? [5]
김연혜
2005-04-08
3331
22269데이타가 들어있는 CLOB형의 컬럼을 LONG형으로 변환이 가능할까요 [3]
형변환
2005-04-08
2418
22268조인시 데이타 이상합니다... [1]
송만석
2005-04-07
978
22266일별,월별,년별 통계를 내고 싶은데 초짜라 자문을 구합니다. [3]
천둥이
2005-04-07
4188
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다