쿼리에 대한 조언좀 얻고 싶습니다. 0 4 1,800

by 보안관 [SQL Query] [2012.10.22 13:28:13]


일단 해당 테이블의 모든 인덱스는 a1과 a2가 들어간 상태로 생성 되어있습니다.
table a  사이즈 2G

원본 쿼리가 쓸데없이 disk 괴롭히고 있어 수정쿼리로 수정해보았습니다.
문제는 뭔가 참신하지도 않고 쓸데없이 쿼리도 길고 이쁘지도 않아서 다른 좋은 방법이 없을지 궁금해서 문의드립니다.

뭔가 쌈빡한 아이디어좀 제공해주세요!


-- 원본 쿼리 : 4곳의 게시판에서 최신 글 4개만을 가져오는 쿼리입니다.
select *
from (
    select *
    from A
    where 1=1
    and a_1 = 1
    and a_2 in (1,2,3,4)
    order by input_dttm desc
)
where 1=1
and rownum <= 5
;
-- 수정 쿼리 : index_desc 힌트를 사용해서 해당 글의 최신글 각각 5개씩을 가져와서 최신글 5개만을 추출
   a_input 구성(a_1 asc, a_2 asc, input_Dttm, a_3 asc)
select *
from (
    select *
    from (
    select /*+ index_desc(a a_input) */ *
    from A
    where a_2 = 1 and a_1 = 1 and rownum <= 5
    union all
    select /*+ index_desc(a a_input) */ *
    from A
    where a_2 = 2 and a_1 = 1 and rownum <= 5
    union all
    select /*+ index_desc(a a_input) */ *
    from A
    where a_2 = 3 and a_1 = 1  and rownum <= 5
    union all
    select /*+ index_desc(a a_input) */ *
    from A
    where a_2 = 4 and a_1 = 1 and rownum <= 5
)
    where 1=1
    order by input_dttm desc
)
where 1=1
and rownum <= 5
;

아 그리고 오라클 클럽 개편했나요? 오랜만에 들어왔더니 계정이 없어져버렸네요.
 ㅡ.ㅜ 질문했던 거와  답변했던 거좀 보려고 했더니 찾을수가 없네요.
by 부쉬맨 [2012.10.22 13:42:01]
a_2 의도가 게시판의 구분이라면

with t as
(
select '1' a , '1' b from dual union all
select '2' a , '1' b from dual union all
select '3' a , '1' b from dual union all
select '3' a , '22' b from dual union all
select '3' a , '1' b from dual union all
select '4' a , '1' b from dual
)
select a, max(b) 
from t
group by a 

각게시판을 그룹으로 나눈다음에 최근 max 의 데이터만 가져오게하는건데
저값이 존재하는지모르겠네요 순번이라듯지..

by 보안관 [2012.10.22 13:45:26]

좋은 방법이긴 하지만 게시판 마다  최신글을 1개씩만 가져오는게 아니라 4개 게시판을 통틀어서 가장 최근 글 5개를  가져오느거라서요.
답변은 매우 감사합니다. 저거 보니깐 새로운 아이디어가 하나 떨어올랐어요 ㅋㅋ


by 마농 [2012.10.22 14:42:45]

(a1, 등록일자, a2) 로 된 인덱스가 있다면 좋겠네요.
index_desc 와 rownum 으로 한번에 해결될텐데요.


by 보안관 [2012.10.22 15:32:46]

아쉽지만 이게 최선인가 봐요.
좋은 답변들 감사드립니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입