문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판 이전 판 다음 판 | 이전 판 다음 판 양쪽 다음 판 | ||
study:oracle:datadb:1week_2 [2010/05/06 15:19] ahmax |
study:oracle:datadb:1week_2 [2010/05/06 16:18] ahmax |
||
---|---|---|---|
줄 35: | 줄 35: | ||
- PGA버퍼에서 찾을 수 없다면 다시 다른 블록을 SGA에 액세스하여 새로운 블럭을 담고 위의 처리를 반복수행한다. | - PGA버퍼에서 찾을 수 없다면 다시 다른 블록을 SGA에 액세스하여 새로운 블럭을 담고 위의 처리를 반복수행한다. | ||
- 리프블록에서 액세스한 로우가 처리범위를 넘으면 처리를 종료한다. | - 리프블록에서 액세스한 로우가 처리범위를 넘으면 처리를 종료한다. | ||
- | + | === ROWID의 구성 | |
- | | + | |
* rowid라는 가상 컬럼에 저장된다. | * rowid라는 가상 컬럼에 저장된다. | ||
* Single row access를 위한 row 고유한 주소 | * Single row access를 위한 row 고유한 주소 | ||
줄 244: | 줄 243: | ||
agent_no | agent_no | ||
end); | end); | ||
+ | |||
+ | |||
+ | == 부모테이블의 컬럼과 결합한 인덱스 생성 == | ||
+ | * 인덱스의 사용 시 두개의 인덱스를 동시에 쓰기어려운 제한 조건이 있었는데 하나의 선행인덱스가 사용된다면 다른 인덱스는 체크조건으로 사용된다는 점이다. (인덱스머지는 제외) | ||
+ | |||
+ | | ||
+ | from movement x, movement_trans y | ||
+ | where x.mov_order = y.mov_order | ||
+ | and x.deptno = ' | ||
+ | and y.mov_date like ' | ||
+ | |||
+ | 위와 같은 sql이 있다면 | ||
+ | 이때 두개의 조건이 함께 처리 주관조건이 된다면 아주 양호한 수행속도를 얻을 수 있다면 다음과 같은 함수기반인덱스를 이용하여 해결 할 수 있다. | ||
+ | |||
+ | | ||
+ | return varchar2 DETERMINISTIC is | ||
+ | ret_val varchar2(5); | ||
+ | | ||
+ | select deptno into ret_val | ||
+ | from movement | ||
+ | where mov_order = v_mov_order; | ||
+ | return ret_val; | ||
+ | end get_deptno; | ||
+ | |||
+ | | ||
+ | |||
+ | * ** 단 함수내에 참조 테이블이 있을 경우 버전 별로 차이가 있으므로 주의해서 사용해야한다. ** | ||
+ | |||
+ | === 나. 오류데이터의 검색문제를 해결 === | ||
+ | == 대소문자나 공백이 혼재된 컬럼의 검색 == | ||
+ | |||
+ | | ||
+ | |||
+ | == 불필요한 공백을 제거한 후 비교를 해야하는 경우 | ||
+ | |||
+ | | ||
+ | |||
+ | == 접두사를 채워서 검색 == | ||
+ | * 전화번호 앞번호가 018이면 그냥 두고 아니면 016을 붙여서 비교할 때 | ||
+ | |||
+ | | ||
+ | on call_data (decode(substr(call_number, | ||
+ | |||
+ | === 다. 가공처리 결과의 검색 === | ||
+ | == 복잡한 계산결과의 검색 == | ||
+ | * 상품별로 데이터량이 많을 때 주문단가에서 할인금액을 뺀 실제 적용단가에 주문수량을 곱하여 금액별로 100개의 상품을 조회할때 복잡한 계산식을 함수기반인덱스로 만들어 결과값을 논리컬럼으로 저장해두면 힌트에서 인덱스를 사용할 수 있다. | ||
+ | |||
+ | | ||
+ | on order_items(item_cd, | ||
+ | |||
+ | | ||
+ | from order_items x | ||
+ | where item_cd = :b1 | ||
+ | and rownum <= 100 | ||
+ | |||
+ | * 말일, 단가, 율의 검색 : 해당월에 가장 높은 sal_amount가 발생한 건을 찾는 경우 | ||
+ | |||
+ | | ||
+ | |||
+ | * 기간을 검색하는 경우 | ||
+ | |||
+ | | ||
+ | |||
+ | * 길이를 검색하는 경우 . | ||
+ | |||
+ | | ||
+ | |||
+ | === 라. 오브젝트 타입의 인덱스 검색 === | ||
+ | |||
+ | * 육면체(cube)를 오브젝트타입으로 생성하오 이것을 이용하여 부피를 구하는 예 | ||
+ | |||
+ | 길이, | ||
+ | |||
+ | | ||
+ | ( | ||
+ | length number, | ||
+ | width number, | ||
+ | heigth number, | ||
+ | member function volume return number DETERMINISTIC | ||
+ | ); | ||
+ | | ||
+ | create or replace type body cube as | ||
+ | member function volume return number is | ||
+ | begin | ||
+ | | ||
+ | end; | ||
+ | end; | ||
+ | |||
+ | cube유형(TYPE)으로된 CUBE_TAB 테이블을 생성하고, | ||
+ | |||
+ | | ||
+ | | ||
+ | |||
+ | 인덱스를 경유하여 엑세스를 수행 | ||
+ | |||
+ | | ||
+ | |||
+ | === 마. 베타적 관계의 인덱스 검색 === | ||
+ | |||
+ | * 여기서 말하는 배타적(Exclusive)관계에 있는 컬럼이란 데이터 모델링 상에서 서로 다른 서브타입(Subtype)에 있는 컬럼들 중에서 동일한 속성으로 통합할 수 있는 컬럼들의 관계를 말한다. | ||
+ | |||
+ | == 배타적 관계의 유일성 보장 == | ||
+ | |||
+ | * 어떤 배타적 관계에 있는 속성들을 관찰하면 동일한 속성(subtype)으로 볼 수 있으며 이들을 결합했을 경우 반드시 존재해야한다거나 유일해야 한다는 원칙이 있을 수 있다. 이런경우 함수기반 인덱스를 생성하여 처리의 단순화 및 시스템을 통한 제약조건의 검증까지 보장받을 수 있다. | ||
+ | |||
+ | * 배타적 관계에 있는 주민등록번호와 사업자등록번호를 결합하여 유일성을 체크할 수 있을 뿐 아니라 검색의 단순화를 얻을수 있는 예 | ||
+ | |||
+ | | ||
+ | on customers(case when cust_type =1 then resident_id else business_id end); | ||
+ | |||
+ | | ||
+ | where (case when cust_type =1 then resident_id else business_id end) = :b1; | ||
+ | |||
+ | * 특정한 범위의 데이터에 대해서만 유일성을 체크할도록 할 수 있는 사례. | ||
+ | * 예를들어 ' | ||
+ | |||
+ | | ||
+ | case when then ins_type = ' | ||
+ | case when then ins_type = ' | ||
+ | ); | ||
+ | |||
+ | * 이 인덱스는 INS_TYPE =' | ||
+ | * 다음과 같은 입력이 발생하면 에러가 나타단다. | ||
+ | |||
+ | | ||
+ | | ||
+ | |||
+ | 1row created. | ||
+ | |||
+ | | ||
+ | | ||
+ | |||
+ | ERROR at line 1; | ||
+ | | ||
+ | |||
+ | == 배타적관계의 결합인덱스 == | ||
+ | * 어떤 구분값을 기준으로 결합인덱스의 구성이 달라진다면 함수기반인덱스로 해결할 수 있다. | ||
+ | |||
+ | | ||
+ | | ||
+ | case when ord_type=1 then delivery_date else shipping_date end), // 중간 컬럼인덱스 | ||
+ | | ||
+ | ) | ||