2011. 10. 10. 16:22

Hash Join 제약.


if object_id('tblx') is not null

drop table tblx

go

 

if object_id('tbly') is not null

drop table tbly

go

 

 

create table tblx

(idx int

,c1 int

)

go

 

create table tbly

(idx int

,c1 int

)

go

 

insert into tblx values (1,1)

insert into tblx values (1,2)

insert into tbly values (1,1)

insert into tbly values (2,null)

go

 

 

select * from tblx

select * from tbly

 

 

set statistics profile on

 

select *

  from tblx a

  join tbly b

    on a.idx = b.idx

 where a.idx > 1

option (hash join)







 



select *

  from tblx a

  join tbly b

    on a.idx = b.idx

 where a.idx = 1

option (hash join)

 

메시지8622, 수준16, 상태1, 1

이쿼리에정의된힌트로인해쿼리프로세서에서쿼리계획을생성할수없습니다. 힌트를지정하거나SET FORCEPLAN을사용하지않고쿼리를다시전송하십시오.

 

-

select *

  from tblx a

  join tbly b

    on a.idx = b.idx

 where a.idx = 1








-       Hash Join  적어도 하나의 equijoin predicate 있어야 있다. 그런데 커리는 그런 부분이 없다. Mearge join 마찬가지다.

 

select *

  from tblx a

  full outer join tbly b

    on a.idx = 1

option (merge join)

-       위 쿼리는 가능하다. Full outer mearge join의 경우 non equijion도 가능하기 때문이다.

select *

  from tblx a

  join tbly b

    on a.idx > b.idx








-       Hash join이 가능한가? 안된다. Hash 함수는 통과한 값의 크다 작다를 비교할 수 없다.

-        

select *

  from tblx a

  join tbly b

    on a.idx > b.idx

option (hash join)

메시지 8622, 수준 16, 상태 1, 1

쿼리에 정의된 힌트로 인해 쿼리 프로세서에서 쿼리 계획을 생성할 없습니다. 힌트를 지정하거나 SET FORCEPLAN 사용하지 않고 쿼리를 다시 전송하십시오.

if object_id('tblx') is not null

drop table tblx

go

 

if object_id('tbly') is not null

drop table tbly

go

 

 

create table tblx

(idx int

,c1 int

)

go

 

create table tbly

(idx int

,c1 int

)

go

 

insert into tblx values (1,1)

insert into tblx values (2,2)

insert into tbly values (1,1)

insert into tbly values (2,null)

go

 

 

select * from tblx  where c1 in (select c1 from tbly) option(hash join)

 

select * from tblx  where c1 not in (select c1 from tbly) option(hash join)

에러. null 있다.

 

-       Tblx c1 컬럼에 not null 체크조건을 주거나 null을 입력하지 않으면 hash join을 잘 사용할 수 있다.

혹은 아래 처럼 한다.  그래야 equijoin predicate 존재한다.

  select * from tblx  where c1 not in (select c1 from tbly where c1 is not null)

and c1 is not null option(hash join)

 

'Peformance Tuning' 카테고리의 다른 글

query plan의 실행 옵션 보기  (0) 2012.01.29
Dynamic Management Views  (0) 2012.01.22
Join의 종류  (1) 2011.10.10
Tuning::Top 10 SQL Server performance Tuning  (0) 2011.01.16