반응형
ORACLE에서 작업하고 잇는데
A 테이블의 ROW수가 1300000
B 테이블의 ROW수가 약 200000이야 해당 쿼리가 시간이 너무 오래걸리는데 최적화 시킬수 있을까?
DELETE
FROM A
WHERE ID IN (SELECT ID
FROM B
WHERE CREAT_DT < TO_DATE('2023-07-01','YYYY-MM-DD'));
1. 인덱스 추가: T_ELN_SHEET 테이블의 CREAT_DT 열과 T_ELN_SHEET_MTRAL 테이블의 SHEET_ID 열에 인덱스를 추가할 수 있습니다. 인덱스를 사용하면 쿼리의 실행 속도를 향상시킬 수 있습니다.
2. EXISTS 절 사용: 대신 IN 절을 사용하는 대신 EXISTS 절을 사용할 수 있습니다. EXISTS 절은 서브쿼리가 참일 경우에만 조건을 충족하도록 동작합니다. 다음과 같이 변경할 수 있습니다.
```
DELETE
FROM A
WHERE EXISTS (
SELECT 1
FROM B
WHERE A.ID = B.ID
AND CREAT_DT < TO_DATE('2023-07-01','YYYY-MM-DD'));
```
3. 일괄 처리: 대량의 데이터를 삭제해야 하는 경우, 일괄 처리 방식을 고려할 수 있습니다. 삭제 대상 데이터를 일괄적으로 처리하는 방식은 실행 속도를 향상시킬 수 있습니다. 예를 들어, DELETE 문을 수십 번 반복 실행하는 대신, 한 번의 DELETE 문에 여러 ID를 포함시킬 수 있습니다.
4. 성능 프로파일링: 데이터베이스 성능 프로파일링 도구를 사용하여 쿼리의 성능을 분석할 수 있습니다. 성능 향상을 위한 추가적인 개선 사항을 찾을 수 있습니다.
5. IN 대신 EXISTS 사용
WHERE문에서 서브 쿼리의 값을 확인하려는 경우 IN 또는 EXISTS를 사용할 수 있습니다. IN과 EXISTS는 검색 결과에 따라 어느 것을 사용할지 결정해야 합니다. 서브 쿼리의 결과가 많으면 EXISTS가 나은 성능을 제공하며 그렇지 않으면 IN을 사용하는 것이 좋습니다.
EXISTS는 일치하는 항목이 발견되는 즉시 검색 프로세스를 종료하지만 IN은 모든 항목을 비교하기 때문입니다.
출처: https://developer-talk.tistory.com/420 [DevStory:티스토리]
반응형
'컴퓨터 과학 > 데이터베이스' 카테고리의 다른 글
데이터베이스 구조 재조정 (0) | 2023.11.17 |
---|---|
CTAS (효율적인 UPDATE, DELETE) (0) | 2023.11.15 |
Toad - compare (0) | 2023.10.25 |
데이터베이스 접속오류(ORA-12170) (0) | 2023.10.16 |
not in 과 not exists의 차이 (1) | 2023.10.14 |