IN&EXISTS 와 NOT IN&NOT EXISTS 의 최적화 원칙 요약

3880 단어 EXISTSIN
1.EXISTS 의 실행 프로 세 스 select*from t1 where exists(select null from t2 where y=x)는 다음 과 같이 이해 할 수 있다.색인 이 있 을 때 exists 를 사용 합 니 다.사실 우리 가 in 과 exists 를 구분 하 는 것 은 주로 구동 순서 의 변 화 를 초래 한 것 이다(이것 은 성능 변화의 관건 이다).만약 에 exists 라면 외층 표를 구동 표 로 하고 먼저 방문 된다.만약 에 IN 이 라면 서브 조 회 를 먼저 실행 하기 때문에 우 리 는 구동 표 의 빠 른 귀환 을 목표 로 한다.그러면 색인 및 결과 집합 관 계 를 고려 할 것 입 니 다.다른 IN 에 서 는 NULL 을 처리 하지 않 습 니 다.예 를 들 어 select 1 from dual where null in(0,1,2,null)결 과 는 비어 있 습 니 다.2.NOT IN 과 NOT EXISTS:NOT EXISTS 의 실행 절차
 
for x in ( select * from t1 )
loop
if ( exists ( select null from t2 where y = x.x )
then
OUTPUT THE RECORD
end if
end loop
주의:NOT EXISTS 와 NOT IN 은 완전히 교체 되 지 않 고 구체 적 인 수 요 를 볼 수 있 습 니 다.선택 한 열 이 비어 있 으 면 바 꿀 수 없습니다.예 를 들 어 다음 문장 을 보면 그들의 차 이 를 볼 수 있다.select x,y from t;x y---------1 3 1 2 1 1 1 3 5 select*from t where x not in(selection y from t t2)no rows select*from t where not exists(select null from t t2 where t2.y=t.x)x y---------------------------------------------------------------------------------select 키워드 뒤의 필드 에 not null 제약 이 있 거나 이러한 암시 가 있 을 때 not in 을 사용 합 니 다.또한 주 조회 에 표 가 크 고 하위 조회 에 표 가 작 지만 기록 이 많 으 면 not in 을 사용 하고 anti hash join 을 사용 해 야 합 니 다.주 조회 표 에 기록 이 적 고 하위 조회 표 에 기록 이 많 으 며 색인 이 있 으 면 not exists 를 사용 할 수 있 습 니 다.또한 not in 은/*+HASH 를 사용 하 는 것 이 좋 습 니 다.AJ*/또는 외부 연결+is null NOT IN 은 원가 기반 응용 에서 좋 습 니 다.예 를 들 어
 
select .....
from rollup R
where not exists ( select 'Found' from title T
where R.source_id = T.Title_ID);
select...from title T,rollup R where R.sourceid = T.Title_id(+) and T.Title_id is null; 또는(가)sql>select/*+HASHAJ */ ... from rollup R where ource_id NOT IN ( select ource_id from title T where ource_id IS NOT NULL)주의:위 에 서 는 이론 적 으로 몇 가지 건 의 를 했 을 뿐 가장 좋 은 원칙 은 여러분 이 위 에 있 는 기초 위 에서 실행 계획 을 사용 하여 분석 하여 가장 좋 은 문장의 쓰 기 를 얻 을 수 있다 는 것 입 니 다.'//=================================exists,not exists 총화 1 exists SELECT*FROM ankenm WHERE EXISTS( SELECT my_list_temp_m.sales_code FROM my_list_temp_m WHERE my_list_temp_m.sales_code=anken_m.sales_code)설명:1)anken 조회m 표 와 mylist_temp_m 표 에 모두 존재 하 는 salescode。 2) sales_code 는 ankenm 의 메 인 키,mylist_temp_m 의 외 키.주의:1)외부 조회 표 ankenm 는 조회 대상 이다.2)내부 조회 표 mylist_temp_m 는 조건 대상 이다.3)내외 층 의 조회 표 는 같 을 수 없다.4)관련 조건 으로 하 는 ankenm 표 는 내부 에서 FROM 을 조회 한 후에 추가 할 필요 가 없습니다.5) my_list_temp_m.sales_code=anken_m.sales_code 조건 의 좌우 순 서 는 조회 결과 에 영향 을 주지 않 습 니 다.2 not exists SELECT * FROM anken_m WHERE NOT EXISTS( SELECT my_list_temp_m.sales_code FROM my_list_temp_m WHERE my_list_temp_m.sales_code=anken_m.sales_code)설명:1)anken 조회m 표 에는 존재 하지만 mylist_temp_m 표 에 존재 하지 않 는 salescode。 2) sales_code 는 ankenm 의 메 인 키,mylist_temp_m 의 외 키.주의:1)외부 조회 표 ankenm 는 조회 대상 이다.2)내부 조회 표 mylist_temp_m 는 조건 대상 이다.3)내외 층 의 조회 표 는 같 을 수 없다.4)관련 조건 으로 하 는 ankenm 표 는 내부 에서 FROM 을 조회 한 후에 추가 할 필요 가 없습니다.5) my_list_temp_m.sales_code=anken_m.sales_code 조건 의 좌우 순 서 는 조회 결과 에 영향 을 주지 않 습 니 다.3 UPDATE anken 종합 운용m SET(plan_type_code, branch_name, business_type_code) =(SELECT anken.plan_type_code,anken.branch_name,anken.business_type_code FROM anken WHERE anken.sales_code=anken_m.sales_code) WHERE EXISTS ( SELECT anken.sales_code FROM anken,my_list_temp_m WHERE my_list_temp_m.sales_code=anken.sales_code AND anken.sales_code=anken_m.sales_code)설명:1)한 표 의 기록 데이터 로 다른 표 의 기록 데 이 터 를 업데이트 합 니 다.2)SQL 문 구 를 일괄 업데이트 합 니 다.2) sales_code 는 anken,ankenm 의 메 인 키,mylist_temp_m 의 외 키.주의:1)set 문장의 업 데 이 트 될 필드 는 데이터 원본 필드 와 일일이 대응 해 야 하 며,또한 데이터 원본 조회 의 조건 은 하나의 기록 을 한정 해 야 합 니 다.즉,salescode 는 anken 의 기록 과 anken 을 유일 하 게 확인 할 수 있 습 니 다.m 의 기록 은 업 데 이 트 될 기록 과 데이터 원본 기록 의 메 인 키 가 같다 는 것 을 보증 할 수 있 습 니 다.2)WHERE EXISTS 구문 에 따라 데이터 원본 기록 의 범 위 를 확인 할 수 있 습 니 다.즉,anken 표 에 있 는 어떤 기록 으로 anken 을 업데이트 할 수 있 습 니까?시계그래서 ankenm 는 WHERE EXISTS 문구 에 있 는 FROM 뒤에 추가 할 필요 가 없습니다.

좋은 웹페이지 즐겨찾기