SQL에서 명시적 Join Transitive Closure의 장점은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/11028

  •  08-06-2019
  •  | 
  •  

문제

3개 이상의 테이블을 공통 열로 조인할 때 쿼리를 다음과 같이 작성합니다.

SELECT *
FROM   a, b, c
WHERE  a.id = b.id
AND    b.id = c.id

최근 동료가 나에게 왜 명시적인 행동을 하지 않았는지 물었습니다. 전이적 폐쇄에 참여 내 쿼리에서는 다음과 같습니다.

SELECT *
FROM   a, b, c
WHERE  a.id = b.id
AND    b.id = c.id
AND    c.id = a.id

정말 이것에 어떤 이점이 있습니까?확실히 옵티마이저가 이를 스스로 암시할 수 있습니까?

편집하다:나는 그것이 사악한 구문이라는 것을 알고 있지만 합법적인 레거시 코드의 빠르고 더러운 예입니다 +1 @스투 그것을 청소하기 위해

도움이 되었습니까?

해결책

오늘날의 데이터베이스 엔진에서는 이 작업을 수행할 필요가 없지만 쿼리 최적화 프로그램에 가능한 인덱스 경로에 대한 더 많은 힌트를 제공하여 더 빠른 결과를 얻을 수 있었던 때가 있었습니다.

요즘에는 어쨌든 전체 구문이 나가고 있습니다.

다른 팁

이것은 더럽고 사악한 레거시 구문입니다.당신은 이것을 다음과 같이 씁니다.

Select
  *  -- Oh, and don't ever use *, either
From
  A 
  Inner Join B On A.ID = B.ID
  Inner Join C On B.ID = C.ID

아니요, 이 구문은 조인이 언어에 포함되기 며칠 전부터 유래되었습니다.이와 관련된 문제는 확실하지 않지만 테이블 연결에 대해 더 많이 지원되는 언어 구성이 확실히 있습니다.

이런 가입은 악마의 짓이라고 말하고 싶습니다.
생각 해보세요;조인 및 필터링 조건은 where 문에서 함께 혼합됩니다.
20개의 테이블을 조인하고 15개의 값을 필터링해야 하면 어떻게 되나요?

다시 말하지만, 내 $.02

Microsoft SQL에서는 이 두 쿼리에 대한 쿼리 계획이 동일합니다. 즉, 동일한 방식으로 실행됩니다.

수학적 관점에서 보면 예제는 동일한 결과를 산출해야 합니다.

a = b = c

따라서 첫 번째 예는 두 번째 예와 동일한 결과를 산출하므로 추가 작업을 수행할 필요가 없습니다.

이 질문은 매우 자세한 설명이 포함된 이 질문과 유사합니다.

Joel Spolsky 기사의 SQL 질문

짧은 대답은 transitiv 속성을 명시적으로 선언하면 쿼리 속도가 빨라질 수 있다는 것입니다.이는 쿼리 최적화가 사소한 작업이 아니고 일부 SQL 서버에 문제가 있을 수 있기 때문입니다.

그 구문에는 용도가 있지만 ...둘 이상의 필드에서 두 테이블을 조인해야 하는 경우가 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top