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 27498 게시물 읽기
No. 27498
좀 복잡한(?) 쿼리질문 입니다.
작성자
이철
작성일
2006-08-07 13:47ⓒ
2006-08-07 13:59ⓜ
조회수
1,761

SELECT * FROM H_TABLE

->결과

 

 

 

 

MANAG_NO F01 F02 F03 F04 F05 F06 F07 F08 F08 F10
2001-00970 1 0 0 0 0 1 1 0 0 1
2004-01005 0 0 0 0 0 0 0 0 0 1
1994-01290 0 1 1 0 0 0 0 0 0 0
1994-01207 1 1 0 0 0 0 1 0 0 1
1994-01233 1 0 1 0 0 0 1 0 0 1
1994-01294 1 1 1 0 0 0 0 0 0 0
2001-00539 0 0 0 0 0 0 0 0 0 0
2001-00597 0 0 0 0 0 0 0 1 1 0


sample query1)

SELECT '1' GRP, MANAG_NO FROM H_TABLE WHERE F01 = '0' AND F02 = '0'
UNION ALL SELECT '2' GRP, MANAG_NO FROM H_TABLE WHERE F03 = '0' AND F04 = '0' AND F05 = '0'
UNION ALL SELECT '3' GRP, MANAG_NO FROM H_TABLE WHERE F06 = '0' AND F07 = '0'
UNION ALL SELECT '4' GRP, MANAG_NO FROM H_TABLE WHERE F08 = '0' AND F09 = '0' AND F10 = '0'
UNION ALL SELECT '5' GRP, MANAG_NO FROM H_TABLE WHERE F06 = '1' AND F08 = '0' AND F10 = '0'
UNION ALL SELECT '6' GRP, MANAG_NO FROM H_TABLE WHERE F07 = '1' AND F09 = '0' AND F10 = '0'


결과1 ->

GRP MANAG_NO
===================
1 2004-01005
1 2001-00539
1 2001-00597
2 2001-00970
2 2004-01005
2 1994-01207
2 2001-00539
2 2001-00597
3 2004-01005
3 1994-01290
3 1994-01294
3 2001-00539
3 2001-00597
4 1994-01290
4 1994-01294
4 2001-00539

 

H_TABLE 라는 테이블의 내용은 위와 같습니다.

여기서 sample query1 쿼리를 사용해서 결과1을 얻어내고 있습니다.

어떻게는 원하는 결과를 얻고는 있지만

UNION ALL을 이용해서 하니 full스캔을 6번 하고있다고 하더군요

좀더 효율적인 다른 쿼리를 이용해서 결과1을 얻고 싶습니다.

어떻게 하면 되나요?

나름대로 decode나 case문을 이용해서 해보고 있지만 쉽지가 않습니다.

고수님들의 많은 조언좀 부탁드려요

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

SELECT FLAG GRP, MANAG_NO
FROM
(
    SELECT MANAG_NO,FLAG,
        F01||F02 NO1,
        F03||F04||F05 NO2,
        F06||F07 NO3,
        F08||F09||F10 NO4,
        F06||F08||F10 NO5,
        F07||F09||F10 NO6
    FROM H_TABLE, COPY_T
    WHERE FLAG < 7
) WHERE DECODE(NO1,0,1) = FLAG
OR DECODE(NO2,0,2) = FLAG
OR DECODE(NO3,0,3) = FLAG
OR DECODE(NO4,0,4) = FLAG
OR DECODE(NO5,100,5) = FLAG
OR DECODE(NO6,100,6) = FLAG;

 

 

여기서 COPY_T 는 flag 컬럼에

1~6까지의 숫자를 각 row에 가지고 있는 테이블이라 가정합니다.

----

flag

----

1

2

3

4

5

6

 

레드님이 2006-08-07 14:40에 작성한 댓글입니다.
이 댓글은 2006-08-07 14:41에 마지막으로 수정되었습니다. Edit

답변 너무너무 감사합니다.

염치불구하고 하나만 더요 ~

 

copy_t 테이블을 더 만들지 않고 하는 방법은 없을까요?

우리 시스템이 아니라서 테이블 생성이 자유롭지 않습니다.

이철님이 2006-08-07 15:42에 작성한 댓글입니다. Edit

댓글을 다신 레드님이 말하신 테이블은 기존의 H_TABLE 테이블을

복사하기 위해서 만든거 같습니다.

그래서 굳이 테이블을 만들 필요는 없구요.

 

SELECT '1' FLAG FROM dual
UNION ALL
SELECT '2' FLAG FROM dual
UNION ALL
SELECT '3' FLAG FROM dual
UNION ALL
SELECT '4' FLAG FROM dual
UNION ALL
SELECT '5' FLAG FROM dual
UNION ALL
SELECT '6' FLAG FROM dual

 

이걸 인라인 뷰로 잡고 기존 테이블과 카티션 프로덕트 조인하시면 됩니다.

 

그런데 문제는 이철님께서 하신 UNION ALL이나 레드님께서 하신

복사테이블이나 FULL SCAN을 하는건 변함이 없습니다.

 

2가지 쿼리 중 어느것이 빠를지는 잘 모르겠네요.

 

만약 FULL SCAN을 피한다면 INDEX를 다는 방법밖에는 없겠지요

강정식(raxsoft)님이 2006-08-07 15:58에 작성한 댓글입니다.

오라클 9i 이상이면 copy_t 만들지 않고 다음을 쓰면

똑같은 효과를 얻을수 있습니다.

 

select level as level# from dual connect by level <= 6

구경하다님이 2006-08-07 17:21에 작성한 댓글입니다. Edit

인덱스를 달지 않는 이상  FULL SCAN은 피할 수 없습니다.

 

강정식님이 말씀하신 것처럼

UNION ALL 을 이용해서 인라인 뷰를 만들면 됩니다.

 

강정식님의 오해가 조금 있으신 것 같아서

첨부합니다.

 

이철님의 쿼리는 FULL SCAN을 6번 합니다.

인라인 뷰나 copy_t 를 사용하면 1번 합니다.

 

당연히 차이가 있습니다.

레드님이 2006-08-09 14:06에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
27502질문]oracle start시 dbms_job 자동 실행에 대해.. [1]
이은미
2006-08-07
1954
27501퀄리 관련 질문입니다. [1]
dbtmdwn
2006-08-07
1350
27499TNS:리스너가 전용 서버 프로세스를 시작하는 데 실패했습니다 [1]
headfirst
2006-08-07
4014
27498좀 복잡한(?) 쿼리질문 입니다. [5]
이철
2006-08-07
1761
27497트랜잭션에 대해서 궁금한점이 있습니다. [1]
오라클
2006-08-06
1306
27496테이블 생성할 때 설정하는 값 [1]
송은정
2006-08-04
1215
27495undo recovery 문제 해결 요청!!!ㅡ,.ㅜ [1]
강민정
2006-08-04
1241
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.022초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다