programing

JOIN 또는 WHERE 내 조건

linuxpc 2023. 4. 26. 23:01
반응형

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

반응형