sql join 문에서 table의 순서에 의미가 있습니까?
sql join 문에서 table 순서에 의미가 있습니까?예를들면
SELECT dept_name, emp_name
FROM Employee
INNER JOIN Department ON Employee.dept_id = Department.dept_id
그리고.
SELECT dept_name, emp_name
FROM Department
INNER JOIN Employee ON Employee.dept_id = Department.dept_id
테이블 순서에 따라 성능상의 이점이 있습니까?
없어요.
비용 기반 옵티마이저를 사용하는 DBMS의 대부분(전부는 아닐 경우).문장을 지정하는 순서는 실행 속도에 영향을 주지 않습니다.
Oracle의 CBO(Cost-Based SQL Optimizer)는 모든 Oracle 쿼리에 대한 실행을 제어하는 매우 정교한 Oracle 구성 요소입니다.CBO는 세계에서 가장 정교한 소프트웨어 구성 요소 중 하나로 발전해 왔으며, SQL 문을 평가하고 해당 문에 대한 "최상의" 실행 계획을 수립하는 어려운 작업을 수행하고 있습니다.
두 문장 모두 동일한 실행 계획을 생성하므로 동일한 성능 특성을 가집니다.비용은 이용 가능한 통계에 근거할 것입니다.통계 업데이트는 옵티마이저가 가장 효율적인 실행 계획을 생성하기 위해 매우 중요합니다.
일반적으로 상관없습니다.최적화자는 쿼리에 나타나는 순서에 관계없이 테이블에 결합하는 가장 효율적인 순서를 파악할 수 있어야 합니다.
그러나 테이블의 순서가 쿼리 계획에 영향을 미칠 수 있습니다.일반적으로 두 개의 테이블 조인이 있는 경우에는 그렇지 않지만 쿼리의 테이블 수가 증가하면 가능한 조인 수가 O(n!) 비율로 증가합니다.Optimizer가 모든 가능한 조인 순서를 고려하는 것은 매우 빨리 불가능해집니다. 따라서 트리를 가지치기 위해 다양한 휴리스틱을 사용해야 합니다.즉, 테이블이 쿼리의 열 번째 테이블인 경우가 아니라 SQL 문에서 해당 테이블이 먼저 나열될 경우 최적화자가 다른 드라이빙 테이블을 선택하는 상황이 발생합니다.Jonathan Lewis는 쿼리에 나타나는 주문 테이블이 쿼리 계획에 어떤 영향을 미칠 수 있는지 보여주는 멋진 블로그 게시물을 가지고 있습니다.각별히 주의하고 싶다면 운전대를 먼저 나열하는 것이 합리적인 방법입니다. 자주 도움이 되지는 않지만 때로는 도움이 될 수도 있습니다.
Optimizer는 가능한 모든 조인 순서 순열을 확인하고 비용 값이 가장 낮은 순열을 선택합니다.즉, 진술서를 준비하는 자체를 최적화하는 것이 복잡한 진술서의 병목 현상이 된다는 것을 의미합니다.결합할 테이블이 많을수록 확인할 실행 계획 변형이 늘어납니다. 즉, 수학적으로 n!(Factory)입니다.
출처 : http://use-the-index-luke.com/sql/join
아니요. 옵티마이저는 최상의 조인 경로를 결정합니다. 아니면 적어도 자신이 생각하는 최선의 조인 경로를 결정합니다.비정상적인 상황에서는 필요한 모든 정보를 가지고 있지 않을 때도 있지만 99%의 경우 정확한 정보를 얻을 수 있습니다.내부적으로 다른 방식으로 SQL 문을 다시 작성합니다.
다른 응답자들이 말하듯이
하지만 내부 접합을 왼쪽 접합으로 대체할 수 있는지 생각해 보세요.대부분의 쿼리에서 이것은 성능의 이점입니다.
언급URL : https://stackoverflow.com/questions/11039236/is-there-any-significance-in-the-order-of-table-in-sql-join-statement
'programing' 카테고리의 다른 글
JavaScript를 사용하여 스크롤 막대 너비 가져오기 (0) | 2023.11.05 |
---|---|
git 저장소에서 bin 및 obj 폴더를 무시하려면 어떻게 해야 합니까? (0) | 2023.11.05 |
Exploent의 필드별 MySQL 순서 (0) | 2023.11.05 |
malloc은 메모리를 할당하는 동안 더 많은 공간을 확보합니까? (0) | 2023.11.05 |
jQuery의 ajax success callback에서 textStatus가 "success"가 되지 않을 수 있습니까? (0) | 2023.11.05 |