SQL에서 명시적 Join Transitive Closure의 장점은 무엇입니까?
-
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
따라서 첫 번째 예는 두 번째 예와 동일한 결과를 산출하므로 추가 작업을 수행할 필요가 없습니다.
이 질문은 매우 자세한 설명이 포함된 이 질문과 유사합니다.
짧은 대답은 transitiv 속성을 명시적으로 선언하면 쿼리 속도가 빨라질 수 있다는 것입니다.이는 쿼리 최적화가 사소한 작업이 아니고 일부 SQL 서버에 문제가 있을 수 있기 때문입니다.
그 구문에는 용도가 있지만 ...둘 이상의 필드에서 두 테이블을 조인해야 하는 경우가 있습니다.