🙇‍♀️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]

  1. 공간을 내주고, 속도를 얻는다
  2. 동일한 값 => 동일한 Bucket (YES)
  3. 동일한 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 조인

  1. 정렬이 필요하지 않다 -> 데이터가 너무 많아서 Merge가 부담스러울 때, Hash가 대안이 될 수 있음
  2. 인덱스 유무에 영향을 받지 않는다!!
    • NL/Merge에 비해 확실한 장점!!
    • HashTable 만드는 비용을 무시하면 안 됨 (수행빈도가 많으면 -> 결국 Index)
  3. 랜덤 엑세스 위조로 수행되지 않는다
  4. 데이터가 적을 쪽을 HashTable로 만드는 것이 유리하다!

태그:

카테고리:

업데이트: