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
운영게시판
최근게시물
MS-SQL Q&A 3835 게시물 읽기
No. 3835
조회 관련 문의 드립니다. (퍼머먼스를 향상시키고 싶습니다.)
작성자
doris
작성일
2007-10-30 11:23ⓒ
2007-10-30 14:24ⓜ
조회수
4,860

idx  ||  kind  ||     code      ||  date
----------------------------------------
 1    ||   1     ||      root       || 2007.10.30
 2    ||   1     ||      01         || 2007.10.30
 3    ||   1     ||      0101      || 2007.10.30
 4    ||   1     ||      010101   || 2007.10.30
 5    ||   1     ||      0102      || 2007.10.30
 6    ||   1     ||      02         || 2007.10.30
 7    ||   1     ||      03         || 2007.10.30
 8    ||   1     ||      0301      || 2007.10.30
 9    ||   1     ||      030101   || 2007.10.30
 10   ||   1     ||      030201   || 2007.10.30
 11   ||   1     ||      030202   || 2007.10.30
 12   ||   1     ||      030203   || 2007.10.30
 13   ||   1     ||      04         || 2007.10.30
 14   ||   1     ||      0401      || 2007.10.30
 15   ||   1     ||      0402      || 2007.10.30
 16   ||   1     ||      0403      || 2007.10.30
   .
   .
   .
2만번째값 ......

트리의 depth(level) : ## 형태로 3level 입니다.  leaf를 표시 해줄 flag는 없습니다. 검색하여 가져와야 합니다. (데이터수가 많아서 풀스캔을 할경우 오래 걸린다는걸 생각해야합니다.)

트리 형태의 테이블이 있습니다.  트리에서 leaf만(마지막번째) 가져오고 싶습니다.  (예를 들면 01을 보면 01밑에 0101이 있고 그 밑에 010101이 있고 그밑에는 더 내려가는 값이
없으므로 010101이 leaf(마지막번째) 값이 겠지요)

결과값
idx  ||  kind  ||     code      ||  date
----------------------------------------
 1    ||   1     ||      root       || 2007.10.30
 2    ||   1     ||      010101    || 2007.10.30
 3    ||   1     ||      0102       || 2007.10.30
 4    ||   1     ||      02          || 2007.10.30
 5    ||   1     ||      030101   || 2007.10.30
 6    ||   1     ||      030201    || 2007.10.30
 7    ||   1     ||      030202    || 2007.10.30
 8    ||   1     ||      030203    || 2007.10.30
 9    ||   1     ||      0401       || 2007.10.30
 10  ||   1     ||       0402       || 2007.10.30
 11  ||   1     ||       0403       || 2007.10.30
  .
  .
  .
 1만8천여건.....
 

이런 형태의 값을 뽑고 싶습니다. (leaf code를 뽑아 오고 싶은 거지요.) 

데이터가 적은줄 알고 만들었던 퀘리 입니다. (위에선 idx, kid, date까지 보여줬지만 그건 나중에 포함시키도 되는거라서 뺐습니다. code가 정확하게 나오고 속도가 빠르게 
나오는 방법을 생각중인데 머리만 잡고 끙끙 거리고 있네요 ㅠㅠ)

select cc.code
from (
        select code 
        from table
        where len(code) = 6 --leaf 번째 값
                  and kid = 1
                  and code <> 'root'

union all

        select code 
        from (
                select code
                from table
                where len(code) <> 6
                         and kid = 1
                         and code <> 'root'
                ) as aa
                , table as bb
         where bb.code like aa.code+'%'
                   and bb.kid = 1
                   and bb.code <> 'root'
         ) as cc

(데이터가 적을 경우 이방법으로 하면 금방 구할수 있습니다. 하지만 데이터가 2만, 3만건이 될경우 상당한 시간이 소요됩니다. index는 물론 걸려있습니다.(code)
테이블 전체에서 검색을 해서 그렇겠지요)

다른 방법을 생각해 보라고 하는 데 flag는 안썼으면 하시고, 속도와 값이 정확하게 나오게 하라고 하시는데 참 난감하네요.

고수님들 저에게 새로운 눈을 뜰수 있도록(서광) 가르쳐 주십시오... 부탁드립니다.~~~

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

참고하세요. 

CREATE TABLE TESTTB
(IDX INT
, CODE VARCHAR(10))
GO
INSERT INTO TESTTB
 SELECT  IDX = 1  ,   CODE = 'ROOT' UNION ALL
 SELECT  IDX = 2  ,   CODE = '01' UNION ALL
 SELECT  IDX = 3  ,   CODE = '0101' UNION ALL
 SELECT  IDX = 4  ,   CODE = '010101' UNION ALL
 SELECT  IDX = 5  ,   CODE = '0102' UNION ALL
 SELECT  IDX = 6  ,   CODE = '02' UNION ALL
 SELECT  IDX = 7  ,   CODE = '03' UNION ALL
 SELECT  IDX = 8  ,   CODE = '0301' UNION ALL
 SELECT  IDX = 9  ,   CODE = '030101' UNION ALL
 SELECT  IDX = 10 ,   CODE = '030201' UNION ALL
 SELECT  IDX = 11 ,   CODE = '030202' UNION ALL
 SELECT  IDX = 12 ,   CODE = '030203' UNION ALL
 SELECT  IDX = 13 ,   CODE = '04' UNION ALL
 SELECT  IDX = 14 ,   CODE = '0401' UNION ALL
 SELECT  IDX = 15 ,   CODE = '0402' UNION ALL
 SELECT  IDX = 16 ,   CODE = '0403'
GO


SELECT
 IDX
 , CODE
FROM
(
 SELECT
  IDX
  , CODE
  , LEAF_YN =  CASE WHEN (SELECT COUNT(*) FROM TESTTB
        WHERE CODE LIKE X.CODE + '%') > 1 THEN 'Y' ELSE 'N' END
 FROM TESTTB  X
) A
WHERE LEAF_YN = 'N'

.님이 2007-10-30 14:35에 작성한 댓글입니다. Edit

알려주신점 감사합니다. 

테스트를 해본 결과 저와 마찬가지로 오랜 시간이 걸렸습니다.  그리고 값도 정확하게 나오지 않네요.


다른 방법 조언해 주신점 정말 감사합니다. 


어여 해결 하고 싶네요. ㅠㅠ 아직도 이것저것 해보고 있습니다. ;;;

doris님이 2007-10-30 17:01에 작성한 댓글입니다.
이 댓글은 2007-10-30 17:07에 마지막으로 수정되었습니다. Edit

왜 안되는지는 잘 모르겠네요. 
혹시 msn등이 있으면 오픈해주시겠습니까? 

직접 들가서 문제를 풀고 싶네요 

.님이 2007-10-31 13:40에 작성한 댓글입니다. Edit

만들어 주신 query의 결과값을 다시 확인해 봤습니다.

값은 정확하게 나오네요. 죄송합니다. 제가 잠시 착각을 해서 그랬습니다.

하지만 속도 자체는 동일하게 나오네요.

CREATE VIEW TABLE 을 해서 스크마를 바인딩 해서 조인을 시켜 봤지만

역시 속도면에서는 동일하더라고요.


                     

doris님이 2007-10-31 14:11에 작성한 댓글입니다. Edit

schemabind를 통한 indexed view로 만드는 것에는 제약사항들이 많습니다. 

그리고 당연히 unique clustered index를 만들어야 합니다. 


.님이 2007-10-31 14:19에 작성한 댓글입니다. Edit

조건이 되는부분과 출력이 되는 부분을 인덱스로 잡았지만, 속도가 나아지지 않네요.

doris님이 2007-10-31 14:45에 작성한 댓글입니다. Edit

지금 어떤 과정에 있는지를 볼 수 있을까요? 글로는 설명하기 힘든듯...
msn이라도 오픈해주겠습니까?

.님이 2007-10-31 18:13에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
3838프로시져 만들었는데요 원래 인자 단독으론 못쓰이는건가요? [3]
새신랑
2007-10-30
3152
3837업데이트 쿼리 질문드립니다. [1]
2007-10-30
2847
3836DB 서버명 변경 후 MSDTC 세팅 문제입니다...
김세윤
2007-10-30
2939
3835조회 관련 문의 드립니다. (퍼머먼스를 향상시키고 싶습니다.) [7]
doris
2007-10-30
4860
3834메모리 누적
냄냄
2007-10-29
2573
383310만건 이상일때 에러 [2]
허저비
2007-10-29
2846
3832SQL 서버 사용자 중 무료 진단 컨설팅이 필요하시면 지금 신청하세요
DBGuide.net
2007-10-29
2500
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다