DataBase
ORDER BY 대신에 INDEX 힌트를 사용하자..
eqzero
2006. 12. 7. 23:35
기존의 내가 사용하던 게시판 리스트를 가져오는 쿼리는
SELECT * FROM (
SELECT ROWNUM rnum, num, id, name FROM MEMBERS
WHERE ROWNUM <= 10
) WHERE rnum > 0
위와 같은 쿼리를 날리면 오라클 기본 정렬을 기준으로 10건까지의 데이터를 가져오게 된다.
문제는 차후에 ORDER BY 가 필요한 경우다.
-- ORDER BY ID DESC, NAME ASC
위와 같은 정렬이 필요한경우 ROWNUM을 사용하면 ORDER BY는 무의미해지므로 다른 방법을 모색해야 했다.
(ROWNUM으로 10건을 가져온후 ORDER BY 하게된다..-_-;).
여러 방법이 있겠지만 내가 선택한 방법은 인덱스를 설정하는것이다
CREATE INDEX IDX_MEMBERS ON MEMBERS(ID DESC, NAME ASC)
위와 같이 만들어주자.
그럼 이제 저 인덱스를 쿼리문에서 힌트에 태워줘보자..-_-;;
SELECT * FROM (
SELECT /*+ INDEX_ASC(MEMBER IDX_MEMBERS) */
ROWNUM rnum, num, id, name FROM MEMBERS
WHERE (ID > 'TEST' OR ID < 'TEST')
AND ROWNUM = 10
) WHERE rnum > 0
WHERE 조건에 ID를 준것은 INDEX를 태우기 위함이다. ID를 주지 않거나 NAME를 주면 타지않는다..
달랑 힌트만 준다고 인덱스를 타진 않는다.
이러면 힌트를 타 정렬된것중에서 10건을 가져오게된다...오묘한 인덱스의 세계~...공부가 쵝오..-_-b
SELECT * FROM (
SELECT ROWNUM rnum, num, id, name FROM MEMBERS
WHERE ROWNUM <= 10
) WHERE rnum > 0
위와 같은 쿼리를 날리면 오라클 기본 정렬을 기준으로 10건까지의 데이터를 가져오게 된다.
문제는 차후에 ORDER BY 가 필요한 경우다.
-- ORDER BY ID DESC, NAME ASC
위와 같은 정렬이 필요한경우 ROWNUM을 사용하면 ORDER BY는 무의미해지므로 다른 방법을 모색해야 했다.
(ROWNUM으로 10건을 가져온후 ORDER BY 하게된다..-_-;).
여러 방법이 있겠지만 내가 선택한 방법은 인덱스를 설정하는것이다
CREATE INDEX IDX_MEMBERS ON MEMBERS(ID DESC, NAME ASC)
위와 같이 만들어주자.
그럼 이제 저 인덱스를 쿼리문에서 힌트에 태워줘보자..-_-;;
SELECT * FROM (
SELECT /*+ INDEX_ASC(MEMBER IDX_MEMBERS) */
ROWNUM rnum, num, id, name FROM MEMBERS
WHERE (ID > 'TEST' OR ID < 'TEST')
AND ROWNUM = 10
) WHERE rnum > 0
WHERE 조건에 ID를 준것은 INDEX를 태우기 위함이다. ID를 주지 않거나 NAME를 주면 타지않는다..
달랑 힌트만 준다고 인덱스를 타진 않는다.
이러면 힌트를 타 정렬된것중에서 10건을 가져오게된다...오묘한 인덱스의 세계~...공부가 쵝오..-_-b