programing

Sql JOIN 순서가 성능에 영향을 미칩니까?

elecom 2023. 6. 22. 21:28
반응형

Sql JOIN 순서가 성능에 영향을 미칩니까?

SQL을 정리하던 중 이 쿼리를 발견했습니다.

SELECT 
        jm.IMEI ,
        jm.MaxSpeedKM ,
        jm.MaxAccel ,
        jm.MaxDeccel ,
        jm.JourneyMaxLeft ,
        jm.JourneyMaxRight ,
        jm.DistanceKM ,
        jm.IdleTimeSeconds ,
        jm.WebUserJourneyId ,
        jm.lifetime_odo_metres ,
        jm.[Descriptor]
FROM    dbo.Reporting_WebUsers AS wu WITH (NOLOCK)
        INNER JOIN dbo.Reporting_JourneyMaster90 AS jm WITH (NOLOCK) ON wu.WebUsersId = jm.WebUsersId
        INNER JOIN dbo.Reporting_Journeys AS j WITH (NOLOCK) ON jm.WebUserJourneyId = j.WebUserJourneyId
WHERE   ( wu.isActive = 1 )
        AND ( j.JourneyDuration > 2 )
        AND ( j.JourneyDuration < 1000 )
        AND ( j.JourneyDistance > 0 )

제 질문은 제가 수행했을 위 쿼리에 대해 조인 순서에 따라 성능 차이가 발생하는지 여부입니다.

FROM dbo.Reporting_JourneyMaster90 AS jm

그리고 다른 두 테이블을 저것에 연결했습니다.

SQL2008R2 서버의 조인 순서는 특히 테이블 조인 수가 많은 쿼리에서 여러 테이블에 대해 절이 적용되는 경우 쿼리 성능에 영향을 미칩니다.

최적화 시 조인 순서가 변경되더라도 옵티마이저가 가능한 모든 조인 순서를 시도하지는 않습니다.최적화 작업이 귀중한 리소스를 사용하기 때문에 실행 가능한 솔루션으로 간주되는 것을 발견하면 중단됩니다.

우리는 개처럼 수행하던 쿼리(1분 + 실행 시간)가 조인 식의 순서를 변경하는 것만으로 2초 미만의 성능으로 내려가는 것을 보았습니다.그러나 이들은 12개에서 20개의 조인과 여러 테이블의 where 절을 가진 쿼리라는 점에 유의하십시오.

요령은 쿼리 최적화 도구가 무엇이 타당한지 파악하는 데 도움이 되도록 순서를 설정하는 것입니다.Force Order를 사용할 수 있지만 너무 딱딱할 수 있습니다.조인 순서가 where 절을 통해 데이터를 가장 많이 줄일 테이블로 시작하는지 확인합니다.

아니요, 순서에 따라 JOIN이 최적화 중에 변경됩니다.

유일하게 주의할 점은 옵션 포스 오더(Option FORCE ORDER)로, 지정한 순서대로 조인이 강제로 발생한다는 것입니다.

저는 성과에 영향을 미치는 내적 결합의 명확한 예를 가지고 있습니다.이것은 두 테이블 사이의 간단한 결합입니다.하나는 5천만 개 이상의 레코드를 가지고 있었고, 다른 하나는 2천 개의 레코드를 가지고 있었습니다.더 작은 테이블에서 선택하고 더 큰 테이블에 참여하면 5분 이상 걸립니다.

큰 테이블에서 선택하고 작은 테이블에 가입하면 2분 30초가 걸립니다.

이것은 SQL Server 2012에 대한 것입니다.

초기 쿼리에 가장 큰 데이터 세트를 사용하고 있기 때문에 이는 반직관적입니다.

보통은 그렇지 않습니다.이것이 Sql-Server에 100% 그대로 적용되는 것은 아니지만 Postgres에서 쿼리 플래너는 적합하다고 판단되는 대로 내부 조인을 재정렬할 수 있는 권한을 보유합니다.예외는 주문 변경을 조사하는 데 너무 많은 비용이 소요되는 임계값에 도달한 경우입니다.

JOIN순서는 중요하지 않습니다. 쿼리 엔진은 인덱스 및 기타 항목에 대한 통계를 기반으로 순서를 재구성합니다.

테스트의 경우 다음을 수행합니다.

  • 실제 실행 계획 표시 및 첫 번째 쿼리 실행을 선택합니다.
  • JOIN합니다.
  • 실행 계획 비교

쿼리 엔진이 다른 요인에 따라 재구성하는 것과 동일해야 합니다.

다른 답변에서 언급했듯이, 당신은 다음을 사용할 수 있습니다.OPTION (FORCE ORDER)당신이 원하는 순서를 정확히 사용하는 것이지만 아마도 그것은 가장 효율적인 순서가 아닐 것입니다.

일반적으로 JOIN 순서는 최소 레코드 테이블이 맨 위에 있어야 하며 대부분의 레코드는 오래 지속됩니다. 일부 DBMS 엔진과 마찬가지로 순서가 변경될 수 있으며 결과를 제한하기 위해 FORCE ORDER 명령을 사용한 경우도 마찬가지입니다.

틀렸습니다. SQL Server 2005는 FROM 절의 처음부터 데이터 집합을 제한하기 때문에 분명히 중요합니다.200만 개가 아닌 2000개의 레코드로 시작하면 쿼리 속도가 빨라집니다.

언급URL : https://stackoverflow.com/questions/16360860/does-sql-join-order-affect-performance

반응형