복붙노트

[SQL] 하위 쿼리 대 조인

SQL

하위 쿼리 대 조인

나는 우리가 내부 대신 같은 하위 쿼리의 조인을 사용하는 다른 회사로부터 상속 된 응용 프로그램의 느린 부분을 리팩토링 :

WHERE id IN (SELECT id FROM ...)

리팩토링 쿼리는 빠른 100 배에 대해 실행됩니다. (~ 0.3-50 초) 나는 개선을 기대하지만, 너무 과감한 왜 깡통 사람이 설명? where 절에 사용되는 열은 모두 인덱스했다. SQL은 행 또는 뭔가에 한 번 where 절에 쿼리를 실행합니까?

업데이트 - 결과를 설명합니다 :

차이는 쿼리 "()의 위치를 ​​ID '의 두 번째 부분에 -

2   DEPENDENT SUBQUERY  submission_tags ref st_tag_id   st_tag_id   4   const   2966    Using where

1 인덱스 행 대 조인

    SIMPLE  s   eq_ref  PRIMARY PRIMARY 4   newsladder_production.st.submission_id  1   Using index

해결법

  1. ==============================

    1.A "상관 부질"(WHERE 조건을 포함하는 쿼리의 행에서 얻어진 값에 따라 결정되는, 즉, 하나)의 각 행에 대해 한번 실행된다. (WHERE 조건을 포함하는 질의 독립적 인 하나의) 비 상관 부질 처음에 한번 실행된다. 는 SQL 엔진이 자동으로이 차이를 만든다.

    A "상관 부질"(WHERE 조건을 포함하는 쿼리의 행에서 얻어진 값에 따라 결정되는, 즉, 하나)의 각 행에 대해 한번 실행된다. (WHERE 조건을 포함하는 질의 독립적 인 하나의) 비 상관 부질 처음에 한번 실행된다. 는 SQL 엔진이 자동으로이 차이를 만든다.

    하지만, 그래, 설명-계획은 당신에게 더러운 세부 사항을 제공 할 것입니다.

  2. ==============================

    2.(가) 인덱스에 어떻게 가입 반면, 당신은 모든 행에 대해 한 번 하위 쿼리를 실행하고 있습니다.

    (가) 인덱스에 어떻게 가입 반면, 당신은 모든 행에 대해 한 번 하위 쿼리를 실행하고 있습니다.

  3. ==============================

    3.여기에 서브 쿼리는 MySQL은 6.0 평가 방법의 예입니다.

    여기에 서브 쿼리는 MySQL은 6.0 평가 방법의 예입니다.

    새로운 최적화에 조인 하위 쿼리의이 종류를 변환합니다.

  4. ==============================

    4.왜 각 버전에 대한 설명-계획을 실행, 그것은 당신을 말할 것이다.

    왜 각 버전에 대한 설명-계획을 실행, 그것은 당신을 말할 것이다.

  5. ==============================

    5.쿼리들이 쿼리 최적화 프로그램을 통해 넣어 데이터 세트에 대해 실행되기 전에 가능한 한, 최적화 시도를 신속로 결과 집합이 많은 튜플 (행)으로 제거 할 수있는 것과 같은 방식으로 쿼리를 구성합니다. 당신이 하위 쿼리 (특히 나쁜 사람)를 사용할 때 외부 쿼리 실행을 시작할 때까지 종종 튜플은 결과 집합의 밖으로 제거되지 않을 수 있습니다.

    쿼리들이 쿼리 최적화 프로그램을 통해 넣어 데이터 세트에 대해 실행되기 전에 가능한 한, 최적화 시도를 신속로 결과 집합이 많은 튜플 (행)으로 제거 할 수있는 것과 같은 방식으로 쿼리를 구성합니다. 당신이 하위 쿼리 (특히 나쁜 사람)를 사용할 때 외부 쿼리 실행을 시작할 때까지 종종 튜플은 결과 집합의 밖으로 제거되지 않을 수 있습니다.

    원래에 대해 너무 나쁜,하지만 내 생각 엔이 최적화 그냥 훨씬 더 할 수 없다는 것이었다 일 것입니다 무슨 말을하는 쿼리가 하드보고 밖으로. '설명'실행하면 데이터를 검색하기위한 최적화 방법을 보여줍니다.

  6. ==============================

    6.각 쿼리에 대한 쿼리 계획을 봐.

    각 쿼리에 대한 쿼리 계획을 봐.

    과 가입 일반적으로 같은 실행 계획을 사용하여 구현 될 수있는, 그래서 일반적으로 그들 사이의 변화에서 제로 속도 향상이있다.

  7. ==============================

    7.최적화는 아주 좋은 일을하지 않았다. 보통 그들은 어떤 차이없이 변형 될 수 있으며, 최적화 알고리즘은이 작업을 수행 할 수 있습니다.

    최적화는 아주 좋은 일을하지 않았다. 보통 그들은 어떤 차이없이 변형 될 수 있으며, 최적화 알고리즘은이 작업을 수행 할 수 있습니다.

  8. ==============================

    8.일반적으로 최적화의 그것의 결과는 그것이 오히려 다음 쿼리하는 테이블에 대해 하위 쿼리에서 테이블을 조인 테이블의 각 레코드에 대한 하위 쿼리를 실행하는 경우에는 참여로 하위 쿼리가 실행 될 수 있음을 알아낼 수없는. 더 "기업용 특성"데이터베이스 중 일부는 더 나은 이것입니다,하지만 그들은 여전히 ​​때때로 그것을 놓치지.

    일반적으로 최적화의 그것의 결과는 그것이 오히려 다음 쿼리하는 테이블에 대해 하위 쿼리에서 테이블을 조인 테이블의 각 레코드에 대한 하위 쿼리를 실행하는 경우에는 참여로 하위 쿼리가 실행 될 수 있음을 알아낼 수없는. 더 "기업용 특성"데이터베이스 중 일부는 더 나은 이것입니다,하지만 그들은 여전히 ​​때때로 그것을 놓치지.

  9. ==============================

    9.이 질문은 그래서 여기에 일반적인 대답 다소 일반적입니다 :

    이 질문은 그래서 여기에 일반적인 대답 다소 일반적입니다 :

    MySQL을 통해 정렬 행의 톤이있는 경우 기본적으로, 쿼리 시간이 더 오래 걸릴.

    이 작업을 수행:

    가, 여기에 결과를 게시 (하나, 다음 하위 쿼리 하나를 가입) 쿼리의 각 EXPLAIN 실행합니다.

    나는 그 쿼리의 MySQL의 해석의 차이를 보는 것은 모두를위한 학습 경험이 될 것이라고 생각합니다.

  10. ==============================

    10.를 Where 하위 쿼리는 각각의 반환 행 1 개 쿼리를 실행한다. 내부는 1 개 쿼리를 실행해야 가입 할 수 있습니다.

    를 Where 하위 쿼리는 각각의 반환 행 1 개 쿼리를 실행한다. 내부는 1 개 쿼리를 실행해야 가입 할 수 있습니다.

  11. ==============================

    11.하위 쿼리는 아마 "전체 테이블 스캔"을 실행했다. 즉, 메인 쿼리가 필요했다에서 어디를 필터링하는 것을 너무 많은 행을 인덱스를 사용하고 방법을 반환하지 않습니다.

    하위 쿼리는 아마 "전체 테이블 스캔"을 실행했다. 즉, 메인 쿼리가 필요했다에서 어디를 필터링하는 것을 너무 많은 행을 인덱스를 사용하고 방법을 반환하지 않습니다.

    다만 과정의 세부 사항없이 추측하지만 일반적인 상황입니다.

  12. ==============================

    12.하위 쿼리를 사용하면 각 결과에 대한 2 SELECT를 다시 실행해야하고, 각 실행은 일반적으로 1 개 행을 반환합니다.

    하위 쿼리를 사용하면 각 결과에 대한 2 SELECT를 다시 실행해야하고, 각 실행은 일반적으로 1 개 행을 반환합니다.

    조인으로, 2 SELECT 반환 더 많은 행,하지만 당신은 한 번만 실행해야합니다. 장점은 이제 결과에 가입 할 수 있으며, 관계를 결합하는 것은 데이터베이스가 잘 될 것으로 예상되는 것입니다. 예를 들어, 어쩌면 옵티마이 저는 이제 인덱스 더 잘 활용하는 방법을 발견 할 수 있습니다.

  13. ==============================

    13.그것은 적어도 오라클의 SQL 엔진의 기초에있다 매우 신속하게 실행에 가입하지만, 너무 많은 IN 절과 같은 부질 없습니다.

    그것은 적어도 오라클의 SQL 엔진의 기초에있다 매우 신속하게 실행에 가입하지만, 너무 많은 IN 절과 같은 부질 없습니다.

  14. ==============================

    14.매뉴얼 참조 (14.2.10.11 재 작성 서브 쿼리가 같은 조인)에서 발췌 :

    매뉴얼 참조 (14.2.10.11 재 작성 서브 쿼리가 같은 조인)에서 발췌 :

    하위 쿼리가 왼쪽보다 느리게 할 수 있도록 [OUTER]를 결합합니다.

  15. from https://stackoverflow.com/questions/141278/subqueries-vs-joins by cc-by-sa and MIT license