2016-12-14 10 views
0

쿼리 성능을 향상시키는 데 도움이 필요합니다.오라클 성능 문제

나는보기에 합류하는 테이블을 가지고 있으며 결과를 얻는 데 7 초가 걸립니다. 하지만 내가보기에 쿼리를 선택하면 1 초 만에 결과를 얻습니다. 테이블 A에 인덱스를 만들었지 만 쿼리가 개선되지 않았습니다.

SELECT 
    ITEM_ID, BARCODE, CONTENT_TYPE_CODE, DEPARTMENT, DESCRIPTION, ITEM_NUMBER, FROM_DATE, 
    TO_DATE, CONTACT_NAME, FILE_LOCATION, FILE_LOCATION_UPPER, SOURCE_LOCATION, 
    DESTRUCTION_DATE, SOURCE, LABEL_NAME, ARTIST_NAME, TITLE, SELECTION_NUM, REP_IDENTIFIER, 
    CHECKED_OUT 
FROM View B, 
    table A 
where B.item_id=A.itemid 
    and status='VALID' 
    AND session_id IN ('naveen13122016095800') 
ORDER BY item_id,barcode; 

CREATE TABLE A 
(
    ITEMID  NUMBER, 
    USER_NAME VARCHAR2(25 BYTE), 
    CREATE_DATE DATE, 
    SESSION_ID VARCHAR2(240 BYTE), 
    STATUS  VARCHAR2(20 BYTE) 
) 

CREATE UNIQUE INDEX A_IDX1 ON A(ITEMID); 
CREATE INDEX A_IDX2 ON A(SESSION_ID); 
CREATE INDEX A_IDX3 ON A(STATUS);' 
+0

은 또한 테이블과 뷰 모두 agaist 쿼리에 대한 실행 계획을 포함 저희에게 당신의 테이블 구조 –

+0

을 제시해주십시오. – JSapkota

+0

은 표 만들기 ( 항목 ID 번호, USER_NAME VARCHAR2 (25 BYTE), CREATE_DATE 날짜, SESSION_ID VARCHAR2 (240 BYTE), 상태 VARCHAR2 (20 BYTE) ) 나는 상품 ID와 고유의 비에 고유 인덱스를 만들었습니다 – Mahi

답변

1

그래서 테이블에 조인 된 뷰를 쿼리하는 것이 뷰를 단독으로 쿼리하는 것보다 속도가 더 빠릅니까? 이것은 놀라운 일이 아닙니다.

어쨌든 필드에 별도의 색인을 만드는 것은 의미가 없습니다. DBMS는 테이블에 액세스하기 위해 하나의 인덱스 (있는 경우)를 선택합니다.

CREATE UNIQUE INDEX A_IDX4 ON A(status, session_id, itemid); 

를하지만 단순히 전체 테이블을 읽는 동안이에 이점을 볼 때 DBMS는 여전히이 인덱스를 사용합니다 : 당신은 구성된 인덱스를 시도 할 수 있습니다. 즉, DBMS가 대용량의 레코드를 읽어야한다고 생각하면 인덱스를 통해 간접적으로 액세스하지 않습니다. 쿼리와 관련된 마지막 두 발언에서

:

  • 은 쉼표로 구분 아웃 날짜가 그 조인을 사용하지 마십시오. 명시 적 ANSI 조인 (FROM View B JOIN table A ON B.item_id = A.itemid)보다 읽기 쉽고 오류가 발생하기 쉽습니다.
  • 쿼리에서 둘 이상의 테이블 또는 뷰를 사용할 때 모든 열에 한정자를 사용하십시오 (and A.status='VALID' ...).

업데이트 : 난 당신이 테이블에서 모든 열을 선택하지 않는 것을 지금보고, 왜 전혀 가입? 레코드가 테이블에 있는지 여부를 찾는 것일 뿐이므로 적절하게 EXISTS 또는 IN을 사용하십시오. (이 빨리 만들 수 있지만 수 많은 읽을 수 이상.)

SELECT 
    ITEM_ID, BARCODE, CONTENT_TYPE_CODE, DEPARTMENT, DESCRIPTION, ITEM_NUMBER, FROM_DATE, 
    TO_DATE, CONTACT_NAME, FILE_LOCATION, FILE_LOCATION_UPPER, SOURCE_LOCATION, 
    DESTRUCTION_DATE, SOURCE, LABEL_NAME, ARTIST_NAME, TITLE, SELECTION_NUM, REP_IDENTIFIER, 
    CHECKED_OUT 
FROM View 
WHERE itemid IN 
(
    SELECT itemid 
    FROM A 
    WHERE status = 'VALID' 
    AND session_id IN ('naveen13122016095800') 
) 
ORDER BY item_id, barcode;