USE_HASH, FULL, PARALLEL 3가지 힌트절은 배치성 쿼리에서 가장 많이 사용되는 힌트절이다. 한마디로 대용량 데이터 처리 및 조회에 빈번하게 사용하는 힌트절이다. 위의 3가지 힌트절만 잘 조합하여 사용한다면 배치 튜닝에서 전혀 어려움이 없다. 힌트절을 사용함에 있어서 처음부터 3가지를 조합하여 사용하기 보다는 다음의 3단계로 나누어서 사용 여부를 검토해야 한다. 1. USE_HASH 힌트절만 사용해서 조회 가능한지 검토 -> 적당히 무거운 쿼리에 사용 2. 조회 범위가 크다면 FULL 힌트절 추가 사용을 검토 -> 대개 이 단계에서 튜닝 완료 3. 대용량 데이터의 빠른 처리가 요구될 때 PARALLEL 힌트절 사용 -> 제한적 사용 특히 PARALLEL 힌트절은 병렬 처리를 위한 힌트절이..
위 그림처럼 두 개의 조건절에 모두 인덱스가 존재할 때 옵티마이저는 통계정보에 근거해 최소한의 비용이 소요되는 인덱스를 선택할 것이다. 하지만 통계정보가 실제 정보를 반영하지 못하여 옵티마이저가 잘못된 선택을 한다든지 혹은 우리가 원하는 인덱스가 아닐 때는 힌트절을 통해 명시적으로 인덱스를 지정할 수 있다. 추가적으로 아래와 같은 INDEX 관련 힌트절도 있다. 인덱스명 설명(표 만들기) INDEX_SS 결합인덱스의 선행 컬럼 조건이 입력되지 않을 때 사용한다. (INDEX SKIP SCAN) INDEX_FFS 인덱스만을 빠르게 전체 스캔한다. (INDEX FAST FULL SCAN) INDEX_DESC 인덱스를 통하여 데이터를 역순으로 스캔한다. 위 그림을 보면 주문일자 조건절로 구간 조회를 하고 있다..
ORDERED와 LEADING은 테이블 간 접근 순서를 결정하는 힌트절이지만 USE_NL, USE_HASH는 테이블 간 접근 방법을 결정하는 힌트절이다. 이러한 힌트절을 통해 오라클 조인 방식을 상황에 맞게 선택해 사용할 수 있다. 오라클의 조인 방식에는 Nested Loop Join, Hash Join, Sort Merge Join 3가지가 있지만, 이중에서 Sort Merge Join은 사용되는 경우가 거의 없다. 개발자가 가장 많이 접하는 조인 방식은 Nested Loop Join이다. 이는 순차적인 루프에 의한 테이블 간 접근 방식이며, 온라인성(OLTP) 쿼리에 많이 사용된다. Hash Join은 해시 함수를 이용한 테이블 간 접근 방식으로, 배치성(Batch) 쿼리에 많이 사용된다. 위 그림의..
동일한 쿼리라도 인덱스 생성 포인트에 따라서 테이블 접근 방향은 가변적이다.따라서 최소한의 코스트가 소요되는 접근 방향을 결정하고 그에 따른 필요한 위치에 인덱스를 생성한다면, 옵티마이저도 우리와 동일한 판단(플랜)을 할 것이다. 하지만 우리가 접한느 대부분의 경우는 이처럼 단순하지는 않다. 위의 그림처럼 1번, 2번, 3번, 4번 모든 컬럼 위치에 인덱스가 존재한다면 테이블의 접근 순서는 명확하지 않다. 고객->주문 방향으로 접근도 가능하고 주문->고객 방향으로 접근도 가능하다.양 방향 접근이 가능한 것이다. 물론 옵티마이저는 수집한 통계정보에 근거하여 가장 최소한의 노력이 드는 방향을 결정하려 할 것이다. 하지만 항상 올바른 결정만 하는 것은 아니다. 만약 우리가 판단하는 접근 방향과 옵티마이저가 판..
힌트절이란 무엇인가? CBO 방식에서 옵티마이저는 주어진 환경(통계정보, SQL문) 하에서 최적의 실행 계획(PLAN)을 제공한다. 그런데 잘못된 SQL문 이나 부정확한 통계정보로 인하여 엉뚱한 실행 계획을 제공할 때도 간혹 있다.이때 힌트절을 통해 잘못된 실행 계획을 바로 잡을 수 있다. 결국 힌트절은 옵티마이저의 실수를 만회할 수 있는 개발자의 마지막 무기라 할 수 있다. SELECT /*+ [힌트절] */ ... FROM ...WHERE ... SQL문에서 힌트절은 주석문 안에 표시한다. 그래서 잘못된 힌트절로 인하여 에러를 리턴하는 일은 없다. 단지 힌트절의 내용대로 적용되지 않을 뿐이다. 오라클이 제공하는 힌트절의 종류는 굉장히 많다. 수 많은 힌트절을 모두 이해하고 상황에 맞게 사용하기에는 너..
Event 명ArgumentReturn Code설명RowFocusChangedcurrentrow(long)Long 0 - 계속 진행DataWindow 에서 현재 Row가 바뀔 때 발생SaveNoneLong 0 - 계속 진행OLE2.0에서 데이터가 저장되었다고, 서버 어플리케이션이 Control에 통보 시 발생ScrollHorizontalscrollpos(long),pane(integer)Long 0 - 계속 진행발생DataWindow내에서 탭 또는 화살표 키, 스크롤바를 통해서 왼쪽 또는 오른쪽으로 스크롤할 때 발생ScrollVerticalscrollpos(long)Long 0 - 계속 진행DataWindow내에서 탭 또는 화살표 키, 스크롤바를 통해서 위쪽 또는 아랜쪽으로 스크롤할 때 발생Selecte..
Event 명ArgumentReturn Code설명PrintFootercurrentpage(long),totalpages(long),currentrow(long)Long 0 - 계속 진행1 - Current 페이지 풋터 프린트 안함RichTextEdit Control 안의 문서 중 페이지의 Fotter 부분을 프린트 시 발생PrintHeadercurrentpage(long),totalpages(long),currentrow(long)Long 0 - 계속 진행1 - Current 페이지 헤더 프린트 안함RichTextEdit Control 안의 문서 중 페이지의 헤더 부분을 프린트 시 발생PrintPagepagenumber(long),copy(long)Long 0 - 프린트 계속1 - 현재 페이지 skip..
Event 명ArgumentReturn Code설명ItemFocusChangedrow(long),dwo(DWObject)Long 0 - 계속 진행현재 Item이 Control안에서 바뀔 때 발생ItemPopulatehandle(long)Long 0 - 계속 진행TreeView Item이 Populate Children시작할 때 발생Keykey(keycode),keyflags(Ulong) - 1 - SHIFT key 2 - CONTROLkey 3 - SHIFT and CONTROL keysLong 0 - 계속 진행1 - Key 무시(RichTextEdit controls only)ListView, TreeView, window에서 사용자가 Key를 눌렀을 경우 발생LineDownNoneLong 0 - 계속..
Event 명ArgumentReturn Code설명DragWithinDataWindow Control - source(DragObject),row(long),dwo(DWObject)ListBox, PictureListBox, ListView, Tab Control - source(DragObject),index(integer)TreeView Control - source(DragObject),handle(long)Window or Other Control - source(DragObject)Long 0 - 계속 진행드래그한 오브젝트가 Control 안에 있을 때 발생DoubleClickedDataWindow Control -xpos(integer),ypos(integer),row(long),dwo(DWO..