복붙노트

[SQL] 어떻게 SQL의 IN 술어 작동합니까?

SQL

어떻게 SQL의 IN 술어 작동합니까?

이 질문에 대한 대답을 prepairing 후 나는 내 대답을 확인할 수 없습니다 발견했다.

처음으로 프로그래밍 작업에서 나는 IN () 조건에서 쿼리가 부모 쿼리에 포함 된 모든 행에 대해 실행됩니다, 따라서 IN이 피해야한다 사용하는 것을 들었다.

예를 들어, 쿼리를 부여 :

SELECT count(*) FROM Table1 WHERE Table1Id NOT IN (
SELECT Table1Id FROM Table2 WHERE id_user = 1)
Table1 Rows | # of "IN" executions
----------------------------------
      10    |       10
     100    |      100
    1000    |     1000
   10000    |    10000

이 올바른지? 어떻게 IN 일 실제로 술어는 무엇입니까?

해결법

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

    1.당신은 하위 쿼리가 각 행에 대해 실행에 대해 가지고 경고는 사실이다 - 상관 서브 쿼리에 대해.

    당신은 하위 쿼리가 각 행에 대해 실행에 대해 가지고 경고는 사실이다 - 상관 서브 쿼리에 대해.

    SELECT COUNT(*) FROM Table1 a 
    WHERE a.Table1id NOT IN (
      SELECT b.Table1Id FROM Table2 b WHERE b.id_user = a.id_user
    );
    

    참고 하위 쿼리는 외부 쿼리의 id_user 열을 참조하는. 표 1의 각 행에 id_user의 값이 다를 수있다. 따라서 서브 쿼리의 결과 가능성이 외부 쿼리의 현재 행에 따라 다를 수 있습니다. RDBMS에 한 번 외부 쿼리의 각 행에 대해, 서브 쿼리를 여러 번 실행해야합니다.

    당신이 테스트 예는 비 상관 서브 쿼리이다. 대부분의 현대 RDBMS 최적화 가치는 소금 서브 쿼리의 결과가 외부 쿼리의 각 행의 값에 의존하지 않을 때 말할 수 있어야합니다. 이 경우, RDBMS는 하위 쿼리를 하나의 시간을 실행의 결과를 캐시와 외부 쿼리의 조건에 대해 반복적으로 사용합니다.

    PS :에서 SQL, IN ()는 "조건"이 아닌 문이라고합니다. 술어는 참 또는 거짓 있지만, 하나 평가가 반드시 문 독립적으로 실행되지 않을 수있는 언어의 일부입니다. 즉, 단지 SQL 쿼리로 이것을 실행할 수있다 : "2 IN (1,2,3);" 이 유효한 조건이지만, 그것은 유효한 문이 아니다.

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

    2.그것은 전적으로 당신이 사용하고있는 데이터베이스 및 정확한 쿼리에 따라 달라집니다.

    그것은 전적으로 당신이 사용하고있는 데이터베이스 및 정확한 쿼리에 따라 달라집니다.

    쿼리 optimisers는 시간에 매우 똑똑 - 샘플 쿼리에, 내가 더 나은 데이터베이스가 조인으로 수행하는 것이 기술의 같은 종류를 사용할 수 있도록 기대. 더 순진 데이터베이스는 동일한 쿼리를 여러 번 실행할 수 있습니다.

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

    3.이 문제의 RDBMS에 따라 달라집니다.

    이 문제의 RDBMS에 따라 달라집니다.

    여기에 상세한 분석을 참조하십시오 :

    한마디로 :

    이 같이 쿼리를 다시 작성합니다 :

    SELECT  (
            SELECT  COUNT(*)
            FROM    Table1
            ) - 
            (
            SELECT  COUNT(*)
            FROM    Table2 t2
            WHERE   (t2.id_user, t2.Table1ID) IN
                    (
                    SELECT  1, Table1ID
                    FROM    Table1
                    )
            )
    

    크게 네 가지 시스템의 성능이 향상됩니다.

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

    4.최적화 프로그램에 따라 다릅니다. 는 RDBMS가 실제로 실행하는 방법을 보려면 각 특정 쿼리에 대한 정확한 쿼리 계획을 확인합니다.

    최적화 프로그램에 따라 다릅니다. 는 RDBMS가 실제로 실행하는 방법을 보려면 각 특정 쿼리에 대한 정확한 쿼리 계획을 확인합니다.

    오라클에있을 거라고 :

    EXPLAIN PLAN FOR «your query»
    

    MySQL의 또는 PostgreSQL을에

    EXPLAIN «your query»
    
  5. ==============================

    5.좌 가입에 대한 대부분의 SQL 엔진은 요즘 거의 항상 NOT IN과 NOT 존재, 같은 실행 계획을 생성합니다

    좌 가입에 대한 대부분의 SQL 엔진은 요즘 거의 항상 NOT IN과 NOT 존재, 같은 실행 계획을 생성합니다

    나는 당신의 실행 계획 봐 말을하고 찾을 것입니다 :-)

    당신이 Table1Id 열에 대해 NULL 값이있는 경우 또한, 당신은 어떤 데이터 등을받지 않습니다

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

    6.정말. 그러나 그것의 버터를 사용하여 이러한 쿼리가 가입 쓰기

    정말. 그러나 그것의 버터를 사용하여 이러한 쿼리가 가입 쓰기

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

    7.네,하지만 실행은 외부 선택의 첫 번째 행이 Table1Id = 32을 가지고 예를 들어 ... 그렇다면 찾고있는 값이 "발견"조회 processer 즉시 중지하고, 표 2는 TABLEID =와 기록이있는 경우 (32) 다음, 빨리 부질는 테이블 ID = 32, 멈출 표 2 행으로 발견 ...

    네,하지만 실행은 외부 선택의 첫 번째 행이 Table1Id = 32을 가지고 예를 들어 ... 그렇다면 찾고있는 값이 "발견"조회 processer 즉시 중지하고, 표 2는 TABLEID =와 기록이있는 경우 (32) 다음, 빨리 부질는 테이블 ID = 32, 멈출 표 2 행으로 발견 ...

  8. from https://stackoverflow.com/questions/761150/how-does-the-in-predicate-work-in-sql by cc-by-sa and MIT license