내가 심하게 수행하는 다음 쿼리를 가지고 :오라클 SQL
select
distinct
u.uuid
u.user_name,
u.key
from request req
join int_user u on u.uuid = req.user_uuid
join int_right r on r.uuid = req.right_uuid
where r.uuid in (
select r2.uuid from int_right r2
where
(
lower(r2.right_name) like '%keyword%'
or lower(r2.right_key) like '%keyword%'
)
)
하위 쿼리는 상관이며 보통 때때로 한 행, 몇 행을 반환합니다. 이제 내가 하위 쿼리를 가져 와서 별도로 실행 한 다음 결과 목록을 가져 와서 정적으로 추가하면 IN 연산자를 외부 쿼리에 추가하면 실행 시간이 3-6s에서 매우 단축됩니다. ~ 0.05s.
r.uuid in ('value1', 'value2', 'value3')
어떻게 하위 쿼리를 실행 한 다음 결과 집합을 외부 쿼리에 적용 할 수 있습니까?
몇 가지 참고 사항 : - 주위 7mln 행
- 약 10K 행
- 요청 테이블은 거대하다 오라클은 모든 테이블에서 전체 검사를 수행합니다. 요청 테이블에서 비용과 카디널리티가 매우 큽니다. 서브 쿼리가 특정 검색 조건에 대해 단일 행을 반환하더라도 쿼리가 여전히 느리다는 것을 의미합니다. IN 인 연산자와 연산자는 매우 빨라지고 낮은 비용. 이 경우 oracle은 int_right 테이블에서 전체 스캔 만 수행하고 다른 테이블에서는 고유 또는 범위 스캔을 수행합니다.
외부 쿼리에 조건을 직접 추가하거나 존재하는 쿼리 또는 상관 된 하위 쿼리와 같은 다른 쿼리를 시도했지만 어떤 경우에도 여전히 느립니다.
오타를 유감스럽게 생각합니다. 고침, 고마워. –
하위 쿼리가 필요한 이유는 무엇입니까? 하위 쿼리의 where 절을 외부 쿼리의 where 절로 사용할 수있는 것 같습니다. – Boneist
사실, 대부분의 경우 외부 쿼리에서 where 절을 사용하면 동일한 성능을 얻습니다. 검색 기준이 길면 (20-30 자) 하위 쿼리로 성능이 향상됩니다. –