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 ;
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 ;
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;
조인 힌트(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의 크기와 구조를 정확하게 인지하고 필요에 때라 사용하셔야 합니다.
반응형