2011-11-18 4 views
1

첫 번째 기본 사항.Oracle JDB Thin Client - varchar2의 고유 인덱스가 사용되지 않음

자바 6 OJDBC6 오라클 10.2.0.4 (11g 버전에서 같은 결과)

나는 SQL 문이 OJDBC6 클라이언트와 자바에서 실행될 때 다르게 행동 및 도구 SQL 문을 사용하고 있음을 경험하고있다 아마도 네이티브/OCI 드라이버를 사용합니다. 일부 이유 때문에 옵티마이 저는 Java에서 실행 된 명령문에 대해 해시 조인을 사용하지만 다른 명령문에서는 해시 조인을 사용하지 않습니다.

CREATE TABLE DPOWNERA.XXX_CHIP (
    xxxCH_ID  NUMBER(22)  NOT NULL, 
    xxxCHP_ID  NUMBER(22)  NOT NULL, 
    xxxSP_ID  NUMBER(22)   NULL, 
    xxxCU_ID  NUMBER(22)   NULL, 
    xxxFT_ID  NUMBER(22)   NULL, 
    UEMTE_ID  NUMBER(38)   NULL, 
    xxxCH_CHIPID VARCHAR2(30)  NOT NULL 
) 

인덱스 : 다음 설명 계획에서

SELECT * 
    FROM (SELECT m2.*, 
      rownum rnum 
      FROM (SELECT m_chip.xxxch_id, 
         m_chip.xxxch_chipid 
         FROM xxx_chip m_chip 
         ORDER BY m_chip.xxxch_chipid) m2 
      WHERE rownum < 101) 
WHERE rnum >= 1; 

그리고 마지막으로 발췌 :

여기

ALTER TABLE DPOWNERA.XXX_CHIP ADD 
    (
    CONSTRAINT IX_AK1_XXX_CHIPV2 
    UNIQUE (XXXCH_CHIPID) 
    USING INDEX 
    TABLESPACE DP_DATA01 
    PCTFREE 10 
    INITRANS 2 
    MAXTRANS 255 
    STORAGE (
     INITIAL 128 K 
     NEXT 128 K 
     MINEXTENTS 1 
     MAXEXTENTS UNLIMITED 
    ) 
); 

내가 사용하는 SQL은 다음

는 테이블

SQL 도구 검색어 :

OPERATION  OBJECT_NAME   COST CARDINALITY CPU_COST 
---------------- ------------------- ----- ----------- ---------- 
SELECT STATEMENT NULL     2   10  11740 
VIEW    NULL     2   10  11740 
COUNT   NULL     NULL  NULL  NULL 
VIEW    NULL     2   10  11740 
NESTED LOOPS  NULL     2   10  11740 
TABLE ACCESS  XXX_CHIP    1  1000000  3319 
INDEX   IX_AK1_XXX_CHIPV2  1   10  2336 
TABLE ACCESS  XXX_CUSTOMER   1   1  842 
INDEX   IX_PK_XXX_CUSTOMER  1   1  105 

QQL 자바 쿼리 OJDBC 씬 클라이언트 : 그래서, 내가 해시가 옵티 마이저에 의해 선택된 조인 이유를 손실하고

**OPERATION  OBJECT_NAME   COST CARDINALITY CPU_COST** 
SELECT STATEMENT NULL    15100   100 1538329415 
VIEW    NULL    15100   100 1538329415 
COUNT   NULL     NULL  NULL  NULL 
VIEW    NULL    15100  1000000 1538329415 
SORT    NULL    15100  1000000 1538329415 
HASH JOIN  NULL     1639  1000000 424719850 
VIEW    index$_join$_004  3   3 2268646 
HASH JOIN  NULL     NULL  NULL  NULL 
INDEX   IX_AK1_XXX_CUSTOMER  1   3  965 
INDEX   IX_PK_XXX_CUSTOMER  1   3  965 
TABLE ACCESS  xxx_CHIP    1614  1000000 320184788 

? 내 생각에 varchar2는 다르게 취급됩니다.

+0

@jdssthlm - 쿼리 계획에서 쿼리가 해당 테이블을 참조하지 않을 때 'XXX_CUSTOMER' 테이블 (및/또는 해당 테이블의 인덱스 인 것으로 보이는 쿼리)을 표시하는 이유는 무엇입니까? 게시 한 쿼리가 게시 한 계획과 일치합니까? Java 코드가 특정 키 값을 선택하기 위해 바인드 변수를 사용하고 있습니까? 바인드 할 때 Java 코드가 올바른 데이터 유형을 전달하고 있습니까? –

+0

Java로 PreparedStatement를 사용하고 있습니까? –

답변

2

답변을 찾았을 때 생각보다 간단했습니다. 모두 인덱스 열의 VARCHAR2 데이터 유형과 관련이 있습니다. 데이터베이스가 언어 및 국가 "en", "US"로 설정되었지만 로컬로 다른 언어 및 지역이 있습니다. 옵티마이 저가 클라이언트와 동일한 언어 및 국가로 구성되지 않았기 때문에 옵티마이 저는 색인을 올바르게 폐기했습니다.

그래서 내가 테스트 한 것은 내 eclipse.ini 파일에 입력 된 일부 추가 -D 매개 변수로 내 이클립스를 시작하는 것이 었습니다.

-Duser.language=en 
-Duser.country=US 
-Duser.region=US 

그런 다음 이클립스의 데이터 소스 탐색기에서 연결을 만들고 내 선언문을 실행하여 매력적으로 작동했습니다.

그래서 배운 교훈은 클라이언트와 데이터베이스가 언어와 호환된다는 것입니다. 아마도 우리는 데이터베이스에서 UTF-8을 사용하도록 변경할 것이므로 모든 설치에서 동일합니다. 그렇지 않으면 국가 및 언어에 따라 설치마다 구성해야합니다.

희망이 있으면 도움이 될 것입니다. 대답이 명확하지 않은 경우 의견을 게시하십시오.