JOIN 절에 WHERE 절에 조건을 넣는 것 사이에 차이 (성능, 모범 사례 등)가 있습니까?
예를 들어 …
-- Condition in JOIN
SELECT *
FROM dbo.Customers AS CUS
INNER JOIN dbo.Orders AS ORD
ON CUS.CustomerID = ORD.CustomerID
AND CUS.FirstName = 'John'
-- Condition in WHERE
SELECT *
FROM dbo.Customers AS CUS
INNER JOIN dbo.Orders AS ORD
ON CUS.CustomerID = ORD.CustomerID
WHERE CUS.FirstName = 'John'
당신은 어느 것을 선호합니까?
답변
관계형 대수를 사용하면 WHERE
절과 의 술어를 교환 할 수 INNER JOIN
있으므로 절이있는 INNER JOIN
쿼리 조차도 WHERE
옵티 마이저에 의해 술어가 재 배열되어 프로세스 중에 이미 제외 될 수 있습니다JOIN
.
가장 읽기 쉬운 방법으로 쿼리를 작성하는 것이 좋습니다.
때로는 여기에는 INNER JOIN
상대적으로 “불완전한”작성 및 WHERE
필터링 기준 목록을보다 쉽게 유지 보수 할 수 있도록하기 위해 일부 기준을 포함시키는 것이 포함됩니다.
예를 들어,
SELECT *
FROM Customers c
INNER JOIN CustomerAccounts ca
ON ca.CustomerID = c.CustomerID
AND c.State = 'NY'
INNER JOIN Accounts a
ON ca.AccountID = a.AccountID
AND a.Status = 1
쓰다:
SELECT *
FROM Customers c
INNER JOIN CustomerAccounts ca
ON ca.CustomerID = c.CustomerID
INNER JOIN Accounts a
ON ca.AccountID = a.AccountID
WHERE c.State = 'NY'
AND a.Status = 1
그러나 그것은 물론 다릅니다.
답변
내부 조인의 경우 실제로 차이를 느끼지 못했습니다 (그러나 모든 성능 조정과 마찬가지로 조건에 따라 데이터베이스를 확인해야합니다).
그러나 왼쪽 또는 오른쪽 조인을 사용하는 경우 조건을 배치하는 위치에 큰 차이가 있습니다. 예를 들어 다음 두 쿼리를 고려하십시오.
SELECT *
FROM dbo.Customers AS CUS
LEFT JOIN dbo.Orders AS ORD
ON CUS.CustomerID = ORD.CustomerID
WHERE ORD.OrderDate >'20090515'
SELECT *
FROM dbo.Customers AS CUS
LEFT JOIN dbo.Orders AS ORD
ON CUS.CustomerID = ORD.CustomerID
AND ORD.OrderDate >'20090515'
첫 번째는 2009 년 5 월 15 일 이후의 주문이있는 레코드 만 제공하므로 왼쪽 조인을 내부 조인으로 변환합니다.
두 번째는 해당 레코드와 주문이없는 고객을 제공합니다. 조건 설정 위치에 따라 결과 집합이 매우 다릅니다. (선택 *은 예제 목적으로 만 사용되며, 프로덕션 코드에서는 사용하지 않아야합니다.)
한 테이블의 레코드 만보고 다른 테이블은보고 싶지 않은 경우는 예외입니다. 그런 다음 조인이 아닌 조건에 where 절을 사용하십시오.
SELECT *
FROM dbo.Customers AS CUS
LEFT JOIN dbo.Orders AS ORD
ON CUS.CustomerID = ORD.CustomerID
WHERE ORD.OrderID is null
답변
대부분의 RDBMS 제품은 두 쿼리를 동일하게 최적화합니다. Peter Gulutzan과 Trudy Pelzer의 “SQL Performance Tuning”에서 여러 브랜드의 RDBMS를 테스트했지만 성능 차이는 없었습니다.
조인 조건을 쿼리 제한 조건과 별도로 유지하는 것이 좋습니다.
OUTER JOIN
때때로 사용하는 경우 join 절에 조건을 넣어야합니다.
답변
JOIN이 발생한 후 WHERE가 필터링됩니다.
JOIN 프로세스 중에 행이 추가되지 않도록 JOIN을 필터링하십시오.
답변
JOIN이 전체 테이블 / 뷰를 조인 한 다음 결과 집합의 조건자를 소개하기 위해 WHERE를 사용하는 것이 좋습니다.
문법적으로 더 깨끗합니다.
답변
일반적으로 조인을 필터링 할 때 성능이 향상됩니다. 특히 두 테이블 모두에 대해 인덱스 열을 조인 할 수있는 경우. 대부분의 쿼리에서도이 작업을 수행하는 논리적 읽기를 줄일 수 있어야합니다. 즉, 대량 환경에서는 실행 시간보다 성능이 훨씬 뛰어납니다.
누군가가 SQL 벤치마킹을 보여줄 때 개발자 서버에서 자정에 sproc 50,000 번의 두 버전을 실행하고 평균 시간을 비교할 때 나는 항상 온화하게 즐겁습니다.
답변
조인에 조건을 넣는 것은 “의미 적으로”잘못된 것 같습니다. 왜냐하면 JOIN은 “for”가 아닙니다. 그러나 그것은 매우 질적입니다.
추가 문제 : 내부 조인에서 오른쪽 조인으로 전환하기로 결정한 경우 조인 내에 조건이 있으면 예기치 않은 결과가 발생할 수 있습니다.