Rookiss Part5 데이터베이스 : Hash 조인
🙇♀️Hash 조인
- 인덱스가 없을 떄 Hash가 강력해짐!
🪐Hash
Hash(해시) 조인
SELECT * INTO TestOrders FROM Orders; SELECT * INTO TestCustomers FROM Customers;
SELECT * FROM TestOrders; – 830 SELECT * FROM TestCustomers; – 91
Hash가 아니라면 느린경우들
- Hash
SELECT *
FROM TestOrders AS o
INNER JOIN TestCustomers AS c
ON o.CustomerID = c.CustomerID;
- NL (inner 테이블에 인덱스가 없다)
SELECT *
FROM TestOrders AS o
INNER JOIN TestCustomers AS c
ON o.CustomerID = c.CustomerID
OPTION (FORCE ORDER, LOOP JOIN);
- Merge(outer, inner 모두 sort => many-to-many)
SELECT *
FROM TestOrders AS o
INNER JOIN TestCustomers AS c
ON o.CustomerID = c.CustomerID
OPTION (FORCE ORDER, MERGE JOIN);
해쉬테이블
41 % 10 = 1 (Key)
41 % 10 = 1 (Key)
41? -> 1 (Key)
HashTable [0 List][1 List][2 List][3][4][5][6][7][8][9]
- 공간을 내주고, 속도를 얻는다
- 동일한 값 => 동일한 Bucket (YES)
- 동일한 Bucket => 동일한 값 (NO)
- rookiss / 루키스짱짱123
-
rookiss / Hash(루키스짱짱123) => ‘12agds141gas1`
- HASH
- 작은 쪽을 HASHTABLE로!
SELECT *
FROM TestOrders AS o
INNER JOIN TestCustomers AS c
ON o.CustomerID = c.CustomerID;
🪐결론
Hash 조인
- 정렬이 필요하지 않다 -> 데이터가 너무 많아서 Merge가 부담스러울 때, Hash가 대안이 될 수 있음
- 인덱스 유무에 영향을 받지 않는다!!
- NL/Merge에 비해 확실한 장점!!
- HashTable 만드는 비용을 무시하면 안 됨 (수행빈도가 많으면 -> 결국 Index)
- 랜덤 엑세스 위조로 수행되지 않는다
- 데이터가 적을 쪽을 HashTable로 만드는 것이 유리하다!