테이블의 전체 내용을 가져오는 경우 성능 향상을 위한 방법
SELECT /*+ FULL(table) PARALLEL(table, 4)*/
usn, point
FROM table;
* /*+ blahblah.. */ 부분은 Oracle optimizer의 동작에 hint를 주기위한 부분으로 일반적으로 "hint" 라고 부릅니다.
* FULL hint 는 full table scan임을 지정합니다. optimizer가 실수해서 엉뚱하게 인덱스를 타거나 하는 경우를 막기 위해 명시적으로 full table scan이라고 알려주는 것입니다.
* PARALLEL hint 는 여러개의 oracle instance가 동시에 돌도록 지정합니다. 위의 예와 같은 경우는 하나의 table을 크게 4개의 부분으로 나눠 4개의 각각 다른 instance가 query 를 해서 가져옵니다. SMP시스템이거나 하나의 테이블이 여러개의 table space(특히 다른 Disk)로 나눠져 있을 경우 유용합니다. CPU도 바쁘고 I/O 채널도 하나라면 별 효과가 없을 수도 있으니 DB상황에 따라 결정해야 합니다.
테이블의 전체 내용을 가져 올 때 1000개씩 가져오는 방법
SELECT /*+ INDEX_ASC(table, table_pk) */
usn, point
FROM table
WHERE rownum < 1000
이렇게 해서 처음 1000개를 가져온후 두번째 1000개는
SELECT /*+ INDEX_ASC(table, table_pk) */
usn, point
FROM table
WHERE usn = :prev_usn
AND rownum < 1000
이렇게 해서 가져옵니다. :prev_usn 에는 처음 query에서 가져온 마지막 item을 사용합니다.
세번째 1000개는 역시 두번째 query 와 동일한 query를 사용하되 :prev_usn에는 역시 두번째 query에서 가져온 마지막 item을 사용합니다.
query결과 rows가 1000개보다 작을 때까지 이 과정을 반복하면됩니다.
* table이라는 테이블에 table_pk 라는 usn 으로 이루어진 Uniq index 가 있는 경우를 가정한 것입니다.
* 모든 usn은 작은것부터 정렬된 순서로 query됩니다. 반대로 하려면 INDEX_ASC() 대신 INDEX_DESC() 를 사용하면 됩니다.
* index가 결합인덱스라면 WHERE 조건절에 다음과 같이 인덱스에 참여한 모든 컬럼을 적어줘야 합니다.
SELECT /*+ INDEX_ASC(table, table_uk) */
usn, point
FROM table
WHERE usn = :prev_usn
AND point = :prev_point
AND rownum < 1000
* index가 uniq index가 아닌 경우에는 조금 다른 방법을 써야 합니다.
댓글 없음:
댓글 쓰기