programing

가입 대 WHERE의 Oracle SQL 쿼리 필터

goodsources 2023. 11. 2. 21:41
반응형

가입 대 WHERE의 Oracle SQL 쿼리 필터

내측 접합부의 경우 필터 적용 성능에 차이가 있습니까?JOIN ON조항이나.WHERE조항?어떤 것이 더 효율적일까요, 아니면 옵티마이저가 그들을 동등하게 만들까요?

가입

SELECT u.name
FROM users u
JOIN departments d
ON u.department_id = d.id
AND d.name         = 'IT'

어디에

SELECT u.name
FROM users u
JOIN departments d
ON u.department_id = d.id
WHERE d.name       = 'IT'

오라클 11gR2

차이가 없어야 합니다.옵티마이저는 두 경우 모두 동일한 계획을 생성해야 하며, 특정 쿼리에 대한 가장 효율적인 접근 방식이 무엇인지에 따라 두 경우 모두에서 결합 전, 후 또는 결합 중에 술어를 적용할 수 있어야 합니다.

물론 일반적으로 옵티마이저가 무엇인가를 할 있다는 사실이 특정 쿼리에서 옵티마이저가 실제로 무엇인가를 한다는 보장은 아닙니다.쿼리가 복잡해짐에 따라 가능한 모든 쿼리 계획을 철저히 고려하는 것이 불가능해집니다. 즉, 완벽한 정보와 완벽한 코드가 있더라도 최적화자는 원하는 모든 작업을 수행할 시간이 없을 수 있습니다.두 쿼리에 대해 생성된 실제 계획이 실제로 일치하는지 확인해야 합니다.

나는 필터 기준을 에 넣는 것을 선호합니다.where

데이터 웨어하우스 쿼리의 경우, 필터 조건을 조인에 넣으면 쿼리가 상당히 오래 지속되는 것 같습니다.

예를 들어, [날짜] 필드별로 색인된 [ 1]과 [파티션] 필드별로 구분된 [ 2]가 있습니다.2는 쿼리에서 가장 큰 표이며 다른 데이터베이스 서버에 있습니다.driving_site hint를 사용하여 옵티마이저에게 표 2 파티션을 사용하도록 지시합니다.

select /*+driving_site(b)*/ a.key, sum(b.money) money
  from schema.table1 a
  join schema2.table2@dblink b
    on a.key = b.key
 where b.partition = to_number(to_char(:i,'yyyymm'))
   and a.date = :i
 group by a.key`

이런 식으로 쿼리를 하면 결과를 반환하는 데 30~40초 정도 걸립니다.

이런 식으로 질의를 하지 않으면 결과 없이 실행을 취소할 때까지 10분 정도 걸립니다.

언급URL : https://stackoverflow.com/questions/25330234/oracle-sql-query-filter-in-join-on-vs-where

반응형