2010-06-11 2 views
3

가입을 위해 내가 3 개 테이블이 표 (1,020,690 레코드), 표 2는, 표 3 (83,692 레코드를) (289,425 레코드) .I는이이대부분의 최적의 순서 (조인) 왼쪽

SELECT * FROM Table1 T1 /* OK fine select * is bad when not all columns are needed, this is just an example*/ 
LEFT JOIN Table2 T2 ON T1.id=T2.id 
LEFT JOIN Table3 T3 ON T1.id=T3.id 
같은

및 쿼리 계획이 2 병합 조인 모두 가입 사용하는 나를 보여줍니다이

SELECT * FROM Table1 T1 
LEFT JOIN Table3 T3 ON T1.id=T3.id 
LEFT JOIN Table2 T2 ON T1.id=T2.id 

같은 쿼리. 첫 번째 쿼리의 경우 첫 번째 병합은 T1과 T2, T3과 병합됩니다. 두 번째 쿼리의 경우 첫 번째 병합은 T1 및 T3과 T2의 병합입니다.

이 두 쿼리는 거의 같은 시간 (대략 40 초)이 걸리거나 때때로 Query1이 몇 초 더 오래 걸립니다.

제 질문은 조인 순서가 중요합니까?

답변

3

이와 같은 간단한 쿼리의 조인 순서는 중요하지 않습니다. 성능을 향상시키기 위해 조인을 재정렬하는 방법이 있다면 그것은 쿼리 최적화 프로그램의 작업입니다.

이론 상으로는 걱정하지 않아도됩니다. 이것이 바로 SQL의 핵심입니다. 쿼리 최적화 프로그램을 능가하려고 시도하는 것이 일반적으로 더 나은 결과를 제공하지는 않습니다. 특히 MS SQL Server에는 매우 훌륭한 쿼리 최적화 프로그램이 있습니다.

이 쿼리에는 40 초가 걸리지 않습니다. 올바른 색인을 정의하지 않았을 수 있습니다. 새 색인을 추천 할 수 있는지 알아 보려면 SQL Server Profiler 또는 SQL Server Database Engine Tuning Advisor과 같은 도구를 사용해야합니다.

1

일반적으로 SQL Server는 가장 좋은 가입 방법을 선택하기에 충분히 스마트하며 쿼리에서 작성한 순서 만 사용하지는 않습니다. 즉, 모든 내부 조인이 처음이고 왼쪽 조인이 있으면 복잡한 쿼리를 쉽게 이해할 수 있습니다.

2

쿼리 최적화 프로그램은 테이블에서 수집 된 제약 조건, 인덱스 및 통계의 조합을 사용하여 실행 계획을 작성합니다. 대부분의 경우이 방법이 효과적입니다. 그러나 가끔 실행 계획을 잘못 선택하는 시나리오가 있습니다. 종종 쿼리를 조정하면 옵티마이 저가 더 나은 계획을 효과적으로 선택하도록 강요 할 수 있습니다. 나는 이것을하기위한 일반적인 규칙을 제시 할 수는 없다. 다른 모든 문제가 발생하면 FORCE ORDERquery hint에 의지 할 수 있습니다.

예, 조인 순서는 쿼리 실행 시간에 중요한 영향을 미칠 수 있습니다. 가장 작은 결과를 산출하는 테이블을 조인하면 다음 조인이 더 빨리 계산됩니다. 편집 : 그러나 abscense가 FORCE ORDER이고 다른 모든 항목이 동일하면 쿼리에서 지정한 순서에 따라 최적화 프로그램이 실행 계획을 작성하는 방식과 상관 관계가 없을 수 있습니다.