JOIN 또는 WHERE 내 조건
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
과 조과항▁and.INNER JOIN
심지어 ㅠㅠINNER JOIN
를 사용하여 .WHERE
절은 최적화 도구에 의해 술어를 재정렬하여 이미 제외할 수 있습니다.JOIN
과정.
가능한 한 읽기 쉬운 방법으로 쿼리를 작성하는 것이 좋습니다.
때때로 이것은 만드는 것을 포함합니다.INNER JOIN
으로 "불완전▁the▁some▁relative▁in다▁criteria▁putting니incom추하▁of합가▁and불"▁the.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
때때로 가입 조항에 조건을 넣는 것이 필요합니다.
조인이 발생한 후 WHERE가 필터링됩니다.
JOIN 프로세스 중에 행이 추가되지 않도록 JOIN에서 필터링합니다.
JOIN이 전체 테이블/뷰에 참여한 다음 WHERE를 사용하여 결과 집합의 술어를 소개하는 것을 선호합니다.
이것은 구문적으로 더 깨끗함을 느낍니다.
일반적으로 조인에서 필터링할 때 성능이 향상됩니다.특히 두 테이블 모두에 대해 인덱스된 열에 조인할 수 있는 경우에는 더욱 그렇습니다.대부분의 쿼리에서도 논리적 읽기를 줄일 수 있어야 합니다. 즉, 대용량 환경에서는 실행 시간보다 훨씬 우수한 성능 지표입니다.
누군가가 SQL 벤치마킹을 보여주고 개발 서버에서 자정에 50,000번 두 버전의 저장 프로시저를 실행하고 평균 시간을 비교할 때 저는 항상 약간 즐겁습니다.
사용할 때 큰 차이를 만들 것이라는 두 번째 가장 많은 투표 답변에 동의합니다.LEFT JOIN
또는RIGHT JOIN
사실 아래의 두 문장은 동일합니다.그래서 당신은 그것을 볼 수 있습니다.AND
절이 이전에 필터를 수행하고 있습니다.JOIN
그 사이에WHERE
절이 다음 이후에 필터를 수행하고 있습니다.JOIN
.
SELECT *
FROM dbo.Customers AS CUS
LEFT JOIN dbo.Orders AS ORD
ON CUS.CustomerID = ORD.CustomerID
AND ORD.OrderDate >'20090515'
SELECT *
FROM dbo.Customers AS CUS
LEFT JOIN (SELECT * FROM dbo.Orders WHERE OrderDate >'20090515') AS ORD
ON CUS.CustomerID = ORD.CustomerID
제 생각에는 당신이 더 큰 테이블이 있을 때 조인이 더 빠릅니다.특히 당신이 다소 작은 테이블을 다루고 있다면 그것은 정말 큰 차이가 없습니다.제가 조인에 대해 처음 알았을 때, 조인의 조건은 절 조건과 같고, 조건을 수행할 테이블에 대해 where 절이 구체적이라면 교환하여 사용할 수 있다고 들었습니다.
조인에 조건을 넣는 것은 JOIN이 "용"이 아니기 때문에 저에게 "의미론적으로 잘못된 것"으로 보입니다.하지만 그것은 매우 질적입니다.
추가 문제: 내부 조인에서 예를 들어 오른쪽 조인으로 전환하기로 결정하면 JOIN 내부의 조건이 예기치 않은 결과를 초래할 수 있습니다.
조인에 조건을 추가하는 것이 좋습니다.가독성보다 성능이 더 중요합니다.대규모 데이터셋의 경우 중요합니다.
언급URL : https://stackoverflow.com/questions/1018952/condition-within-join-or-where
'programing' 카테고리의 다른 글
10개의 무료 사이트 계정에 대한 Azure 임계값은 무엇입니까, 이것은 평생입니까. (0) | 2023.04.26 |
---|---|
routerLink를 사용하여 쿼리 매개 변수를 전달하는 방법 (0) | 2023.04.26 |
vba 매크로에서 빈 배열을 확인하는 방법 (0) | 2023.04.26 |
버튼에서 매크로를 호출하고 인수를 전달하는 방법 (0) | 2023.04.26 |
WPF WebBrowser 컨트롤에서 문자열에서 html 표시 (0) | 2023.04.26 |