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