2015-01-19 2 views
0

다음은 내가 작성한 쿼리입니다. 성능을 향상시킬 수 있는지 알고 싶습니다. 아무도 도와 줄 수 있습니까?쿼리 삭제 - 성능 향상을 위해

DELETE FROM GLOBAL_TEMP 
WHERE EXISTS (
    SELECT GLOBAL_TEMP.ASSET_ID 
    FROM TEMP AEE 
     WHERE GLOBAL_TEMP.ASSET_ID = AEE.ID_ASSET 
     AND GLOBAL_TEMP.TYPE = 'abcdef' 
     AND AEE.id_temp_notation 
    IN (SELECT ID FROM TEMP2 WHERE IS_DISPLAYABLE = 'N') 
); 
+2

삭제하려는 항목과 데이터베이스 정보가 없어도 쿼리를 튜닝하기는 어렵지만 쿼리의 단순성을 살펴보면 어떤면에서는 개선 될 수 있을지는 의문입니다. –

+0

"IN"이 느리거나, 두 번째가 있거나 temp와 temp2 간의 조인이 더 효율적일 수 있습니다. 또한 temp2 id는 temp2에서 is_displayable 인 것처럼 인덱싱됩니까? – xQbert

+0

추가 정보 필요. GLOBAL_TEMP, TEMP 및 TEMP2의 데이터 양. 관련 칼럼의 색인; delete 문에 대한 실행 계획. –

답변

0

이 가능성이 좀 더 효율적으로 ... 절에가에 비해 느릴 수있을 것 대신에 ... (우리가 존재하지 값을 확인하고 이후)도 1을 반환에 가입하거나 존재 각 값을 찾는 것이 약간 더 빠를 것입니다.

DELETE FROM GLOBAL_TEMP 
WHERE EXISTS (
    SELECT 1 
    FROM TEMP AEE 
    INNER JOIN temp2 t2 
    on AEE.ID_temp_notation = t2.id 
    WHERE GLOBAL_TEMP.ASSET_ID = AEE.ID_ASSET 
     AND GLOBAL_TEMP.TYPE = 'abcdef' 
     and t2.is_Displayable='N'); 

그러나, 특정 인덱스, 전체 테이블 관계와 실행 계획과 함께 데이터의 볼륨을 모르고, 이것은 일반적으로 느리다 "의"에 따라 "추측"입니다.

+0

IN 절이 반드시 JOIN으로 대체 될 수는 없습니다. 또한 오라클이 대체 할 수있는 거의 모든 경우에 동일한 실행 계획을 수립 할 것입니다. –

관련 문제