[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.당신은 하위 쿼리가 각 행에 대해 실행에 대해 가지고 경고는 사실이다 - 상관 서브 쿼리에 대해.
당신은 하위 쿼리가 각 행에 대해 실행에 대해 가지고 경고는 사실이다 - 상관 서브 쿼리에 대해.
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.그것은 전적으로 당신이 사용하고있는 데이터베이스 및 정확한 쿼리에 따라 달라집니다.
그것은 전적으로 당신이 사용하고있는 데이터베이스 및 정확한 쿼리에 따라 달라집니다.
쿼리 optimisers는 시간에 매우 똑똑 - 샘플 쿼리에, 내가 더 나은 데이터베이스가 조인으로 수행하는 것이 기술의 같은 종류를 사용할 수 있도록 기대. 더 순진 데이터베이스는 동일한 쿼리를 여러 번 실행할 수 있습니다.
-
==============================
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.최적화 프로그램에 따라 다릅니다. 는 RDBMS가 실제로 실행하는 방법을 보려면 각 특정 쿼리에 대한 정확한 쿼리 계획을 확인합니다.
최적화 프로그램에 따라 다릅니다. 는 RDBMS가 실제로 실행하는 방법을 보려면 각 특정 쿼리에 대한 정확한 쿼리 계획을 확인합니다.
오라클에있을 거라고 :
EXPLAIN PLAN FOR «your query»
MySQL의 또는 PostgreSQL을에
EXPLAIN «your query»
-
==============================
5.좌 가입에 대한 대부분의 SQL 엔진은 요즘 거의 항상 NOT IN과 NOT 존재, 같은 실행 계획을 생성합니다
좌 가입에 대한 대부분의 SQL 엔진은 요즘 거의 항상 NOT IN과 NOT 존재, 같은 실행 계획을 생성합니다
나는 당신의 실행 계획 봐 말을하고 찾을 것입니다 :-)
당신이 Table1Id 열에 대해 NULL 값이있는 경우 또한, 당신은 어떤 데이터 등을받지 않습니다
-
==============================
6.정말. 그러나 그것의 버터를 사용하여 이러한 쿼리가 가입 쓰기
정말. 그러나 그것의 버터를 사용하여 이러한 쿼리가 가입 쓰기
-
==============================
7.네,하지만 실행은 외부 선택의 첫 번째 행이 Table1Id = 32을 가지고 예를 들어 ... 그렇다면 찾고있는 값이 "발견"조회 processer 즉시 중지하고, 표 2는 TABLEID =와 기록이있는 경우 (32) 다음, 빨리 부질는 테이블 ID = 32, 멈출 표 2 행으로 발견 ...
네,하지만 실행은 외부 선택의 첫 번째 행이 Table1Id = 32을 가지고 예를 들어 ... 그렇다면 찾고있는 값이 "발견"조회 processer 즉시 중지하고, 표 2는 TABLEID =와 기록이있는 경우 (32) 다음, 빨리 부질는 테이블 ID = 32, 멈출 표 2 행으로 발견 ...
from https://stackoverflow.com/questions/761150/how-does-the-in-predicate-work-in-sql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 삽입 날짜에 대한 기본 GETDATE (0) | 2020.07.12 |
---|---|
[SQL] 단일 삽입 문에 삽입 할 수 SQL 서버 최대 행 (0) | 2020.07.12 |
[SQL] 봄 부팅 - 저장소 필드를 찾을 수 없습니다 '의 EntityManagerFactory'라는 이름의 빈을 요구 (0) | 2020.07.12 |
[SQL] NVARCHAR 선언에서 생략 크기의 효과는 무엇인가 (0) | 2020.07.12 |
[SQL] 나는 SQL의 숫자를 인용해야 하는가? (0) | 2020.07.12 |