DataBase/MsSql

MSSQL 조인 힌트(join hint) 사용 방법 및 조인 수행 원리

아우럼 2024. 4. 6. 19:00
반응형

조인 힌트(join hint)는 Query의 From 절에서 지정할 수 있는데 SQL Server에서 Query 최적화를 위해서 table 간의 join 방법을 강제적으로 지정할 수 있어 table 간 조인 순서를 지정할 수 있습니다.

조인 힌트(join hint) 특징

  • nested loop join, merge join, hash join을 동시에 사용하지 못하고 하나만 선택해서 사용해야 합니다.
  • 조인에 적용되는 table의 순서를 지정할 수 있으므로 성능 최적화에 효율적으로 사용할 수 있습니다.
  • join hint 적용 시에는 테이블의 크기와 인텍스를 정확하게 알고 있어야 성능 최적화가 가능하므로 초보자는 default 사용하는 것을 추천합니다.

조인 힌트(join hint) 수행원리

Nested Loop join (중첩 루프) hint 설명.

  • Nested Loop 조인은 각 키에 의해 정렬된 양쪽 행들을 순차적으로 병합하여 조인을 수행합니다.
  • 두 테이블을 동시에 스캔하면서 조인을 수행합니다.
  • Nested Loop은 크기가 큰 테이블과 작은 테이블 간의 join에서 효율적으로 수행합니다.
  • 크기가 큰 테이블 하고 큰 테이블 join에서는 성능 문제가 발생합니다.
 --  LOOP  JOIN,  실행계획 단축키:  Ctrl  + M
SELECT*
FROM UserInfoForJoinHint AS emp  
INNER LOOP JOIN DeptInfoForJoinHint AS dept 
ON emp.DeptID = dept.DeptID ;

Nested Loop join (중첩 루프) hint 설명 입니다.
Nested Loop join (중첩 루프) hint   소스및 그림설명 입니다.

Merge join(병합) hint 설명.

  • 테이블 각자가 자기 처리 범위를 전체 액세스하여 정렬해 저장공간에 저장합니다.
  • 부분 범위 처리를 할 수 없으며, 항상 전체 범위 처리를 합니다.
  • Merge join은 저장할 테이블과 조회할 테이블이 같은 모양일 때 효과적입니다.
  • Merge join은 큰 테이블 간의 조인에서 효과적입니다.
--  MERGE  JOIN,  실행계획 단축키:  Ctrl  + M
SELECT*
FROM UserInfoForJoinHint AS emp  
INNER MERGE  JOIN DeptInfoForJoinHint AS dept 
ON emp.DeptID = dept.DeptID ;

Merge join(병합) hint 설명 입니다.
Merge join(병합) hint   소스및 그림설명 입니다.

Hash join(해시) hint 설명.

  • Hash join에는 부분 범위 처리를 할 수 없으며, 항상 전체를 스캔해서 사용합니다.
  • 해시 방식으로 처리되며, 주로 스캔 방식으로 실행합니다.
  • Hash join을 사용하려면 저장할 테이블과 조회할 테이블이 같을 때 효율적입니다.
  • Hash join은 큰 테이블 간의 조인에서 효과적으로 크기가 작은 테이블과 작은 테이블 간의 조인에서는 성능 문제가 발생할 수 있습니다.
--  HASH  JOIN,  실행계획 단축키:  Ctrl  + M
 SELECT*
FROM UserInfoForJoinHint AS emp  
INNER HASH  JOIN DeptInfoForJoinHint AS dept 
ON emp.DeptID = dept.DeptID;

Hash join(해시) hint 설명 입니다.
Hash join(해시) hint  소스및 그림설명 입니다.

조인 힌트(join hint) 마무리하며

join hint basic Query.

  • 예제 소스입니다.
USE sampleDB;
-- join hint 
DROP TABLE IF EXISTS DeptInfoForJoinHint;
CREATE TABLE dbo.DeptInfoForJoinHint
(
	DeptID SMALLINT NOT NULL, 
	DeptName NVARCHAR(40) NOT NULL,
	CONSTRAINT PK_DeptID PRIMARY KEY CLUSTERED (DeptID ASC)
);

DROP TABLE IF EXISTS UserInfoForJoinHint;
CREATE TABLE dbo.UserInfoForJoinHint
(
	EmpID SMALLINT NOT NULL, 
	EmpName NVARCHAR(40) NOT NULL,
	Title NVARCHAR(50) NOT NULL,
	DeptID SMALLINT NOT NULL,
	CONSTRAINT PK_EmpID PRIMARY KEY CLUSTERED (EmpID ASC),
	CONSTRAINT FK_DeptID FOREIGN KEY (DeptID) REFERENCES dbo.DeptInfoForJoinHint (DeptID)
);

INSERT INTO DeptInfoForJoinHint VALUES
(10,'태평양지점'),
(20,'미국지점'),
(30,'마케팅팀'),
(40,'감사팀')
;
  
 INSERT INTO UserInfoForJoinHint VALUES 
(110,'Jessica','태평양지점팀장','10'),
(111,'Alicia','태평양지점','10'),
(120,'Michael','미국지점팀장','20'),
(121,'Alicia','미국지점','20') ;


join hint 주의 사항.

  • join hint를 잘못 사용하면 database 장래를 일으킬 수 있습니다.
  • 테이블, index의 크기와 구조를 정확하게 인지하고 필요에 때라 사용하셔야 합니다.

반응형