2013-10-31 3 views
1
select a_item_id, b_item_id from test_admin; 

위의 선택된 열은 복합 기본 키입니다. where 조건에서 b_item_id 열을 사용하면 쿼리가 더 빨리 수행됩니다. where 조건에서 a_item_id을 사용하면 쿼리가 매우 느리게 실행됩니다.복합 기본 키가 색인을 명시 적으로 요구합니까

복합 기본 키의 두 열에 모두 명시 적으로 인덱스를 만들어야합니까?

explain plan for 
SELECT A.b_item_id 
FROM child_a A,child_b B,child_c C,child_d D,child_e E 
WHERE D.CDE = 1 
    AND E.SUR_ID = '032' 
    AND A.b_item_id = E.S_ID 
    AND D.AD_ID = C.AD_ID 
    AND B.PRO_ID = C.PRO_ID 
    AND A.b_item_id= B.S_ID; 

select * from table(dbms_xplan.display); 

PLAN_TABLE_OUTPUT 
------------------------------------------------------------------------------------------ 

------------------------------------------------------------------------------------------ 
| Id | Operation      | Name  | Rows | Bytes |TempSpc| Cost (%CPU)| 
------------------------------------------------------------------------------------------ 
| 0 | SELECT STATEMENT    |    | 848 | 74624 |  | 7553 (2)| 
| 1 | HASH UNIQUE     |    | 848 | 74624 |  | 7553 (2)| 
|* 2 | HASH JOIN     |    | 12476 | 1072K|  | 7552 (2)| 
| 3 | TABLE ACCESS BY INDEX ROWID| CHILD_E  | 678 | 11526 |  | 148 (0)| 
|* 4 |  INDEX RANGE SCAN   | CHILD_E_IN5 | 678 |  |  |  4 (0)| 
|* 5 | HASH JOIN     |    | 15613 | 1082K| 1360K| 7403 (2)| 
|* 6 |  HASH JOIN     |    | 21679 | 1100K|  | 3864 (2)| 
|* 7 |  HASH JOIN    |    | 21679 | 571K|  | 1830 (2)| 
| 8 |  TABLE ACCESS FULL  | CHILD_A  | 21541 | 168K|  | 21 (0)| 
| 9 |  TABLE ACCESS FULL  | CHILD_B  | 1832K| 33M|  | 1799 (2)| 
| 10 |  TABLE ACCESS FULL  | CHILD_C  | 1700K| 40M|  | 2024 (1)| 
|* 11 |  TABLE ACCESS FULL   | CHILD_D  | 1224K| 22M|  | 1665 (2)| 
------------------------------------------------------------------------------------------ 

Predicate Information (identified by operation id): 
--------------------------------------------------- 

2 - access("A"."b_item_id"="E"."S_ID") 
4 - access("E"."SUR_ID"='032') 
5 - access("D"."AD_ID"="C"."AD_ID") 
6 - access("B"."PRO_ID"="C"."PRO_ID") 
7 - access("A"."b_item_id"="B"."S_ID") 
11 - filter("D"."CDE"=1) 

Note 
----- 
- 'PLAN_TABLE' is old version 

31 rows selected 

Elapsed: 00:00:01.513 
+1

열 정의가 무엇에 있을까? 열 중 하나에 NULLS가 허용 되었습니까? 계획을 게시 할 수 있습니까? – SriniV

+4

기본 키가'(b_item_id, a_item_id)'로 선언 된 것 같습니다. 보조 색인을'(a_item_id, b_item_id)'로 추가하면 쿼리에 도움이됩니다. –

+0

안녕하십니까, 양쪽 열에 NULL 제약 조건이 없습니다. – user2767714

답변

0

복합 색인을 사용하려면 "왼쪽"의 모든 키를 사용해야하므로 그렇지 않습니다. 색인이 필드 (A, B, C)에 있고 사용자 기준이 B와 C에있는 경우, 해당 색인은 해당 조회에 대해 사용자에게 유용하지 않습니다. 따라서 (a_item_id, b_item_id) 및 (b_item_id, a_item_id) 중에서 표를 사용하는 방법에 가장 적합한 것을 선택하십시오.

+0

사실 오라클은 첫 번째 색인 열이 기준에 없더라도 색인을 사용할 수 있지만 '범위 스캔'을 사용하여 색인을 탐색 할 수는 없습니다. 또한 이러한 인덱스의 크기가 테이블 크기와 비슷한 경우 CBO는 테이블을 직접 사용하거나 다른 인덱스를 사용합니다. – ibre5041

0

기존 색인에 (b_item_id, a_item_id)가 포함되어 있으면 b_item_id 또는 b_item_id 및 a_item_id에 대한 술어가있는 조회가 도움이됩니다.

a_item_id에서만 조건자를 사용하여 쿼리를 지원하려면 해당 열에만 인덱스를 추가하십시오. b_item_id 및 a_item_id에서 인덱스를 사용할 수있는 쿼리는 이미 제공되었습니다.

그래서 두 개의 인덱스 (b_item_id, a_item_id) 및 (a_item_id)

관련 문제