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 |