문제

질문 1:

쿼리를 실행하면 쿼리를 실행할 때마다 실행 계획이 변경되나요?

그렇다면 성능 저하가 있습니까?

그렇지 않은 경우, 테이블에서 무언가를 변경하면(예: 인덱스 추가) 더 빠른 실행을 위해 실행 계획을 변경하는 데 사용할 수 있는 것이 있다는 것을 데이터베이스가 어떻게 알 수 있습니까?

질문 2:

그러나 특히 조인이 많은 경우(외부, 내부, 자연, 외부가 많은 경우) 조인 쿼리를 실행하는 동안 일반적인 실행 순서는 무엇입니까?

도움이 되었습니까?

해결책

  • 정확히 말하면 SQL 서버:

캐시에는 최대 두 개의 계획이 있습니다(하나는 병렬, 하나는 비병렬).그런 다음 계획은 실행 컨텍스트 사용자당. 내 답변에 대한 자세한 내용은 여기

  • JOIN 순서는 거의 모든 경우에 관련이 없습니다.

SQL은 선언적입니다.즉, 엔진에 원하는 것을 말하면 최적화 프로그램이 최선의 계획을 수립합니다(합리적인 범위 내에서 최선의 계획을 수립하는 데 2주가 걸릴 수 있음).이것이 동일한 답변을 얻기 위해 다양한 방법으로 쿼리를 다시 작성할 수 있는 이유입니다.

RDBMS에 관한 모든 규칙과 마찬가지로 예외가 있습니다.복잡한 쿼리의 경우 최적화 프로그램은 모든 순열을 거치지 않으므로 JOIN 순서가 중요할 수 있습니다.옵티마이저가 언제 충분하다고 결정하는지에 따라 다릅니다.

다른 팁

(여기서 SQL Server를 가정하면 지정하지 않았습니다 ...)

실행 계획이 캐시되고 쿼리를 매개 변수화하는 정도로 재사용 할 수 있습니다.

기본 테이블 또는 인덱스를 수정하면 SQL Server는 이러한 것들의 수정 날짜와 캐시 실행 계획을 알고 있으며 새로운 조건에 대한 쿼리를 다시 평가할 수 있습니다. 통계가 업데이트 될 때도 마찬가지입니다 ... 때로는 실제 데이터가 테이블/색인 설계뿐만 아니라 계획을 구동합니다.

조인은 내부 대 외부 순서에 따라 수행되는 것이 아니라 최적화 프로그램이 쿼리가 가장 빠르게 실행될 것이라고 생각하는 순서에 따라 수행됩니다.세부사항은 데이터베이스마다 다릅니다.그러나 기본적으로 쿼리 최적화 프로그램은 인덱스 사용을 최적화하려고 시도합니다.

다음과 같은 쿼리가 있다고 가정해 보겠습니다.

select a.foo, b.bar
from a
join b on b.b_id=a.b_id
where a.some_number=42;

이제 b.b_id에는 고유 인덱스가 있지만 a.some_number에는 인덱스가 없다고 가정합니다.

그런 다음 쿼리 최적화 프로그램에는 두 가지 선택 사항이 있습니다.b에서 전체 파일 순차 읽기를 수행한 다음 각 b에 대해 b_id 및 some_number=42에서 일치하는 항목을 찾기 위해 a에서 전체 파일 순차 읽기를 수행할 수 있습니다.그것은 a^b 레코드를 읽습니다.또는 some_number=42를 찾아 전체 파일 순차 읽기를 수행한 다음 각 a에 대해 인덱스를 사용하여 b_id와 일치하는 b의 레코드를 빠르게 찾을 수 있습니다.즉, *2개의 레코드를 읽습니다.음, 분명히 두 번째 계획이 훨씬 더 낫기 때문에 그것이 선택될 것입니다.

더 많은 테이블을 추가하면 계산이 더 복잡해지지만 원리는 동일합니다.다른 테이블에서 찾은 값을 사용하여 빠른 인덱스 읽기를 수행하는 조인은 다른 테이블을 읽은 후 나중에 수행됩니다.무엇이든 순차적으로 읽어야 하는 테이블이나 읽기가 다른 레코드의 값이 아닌 상수를 기반으로 하는 위치는 일반적으로 먼저 읽혀집니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top