인덱스를 이용하는 방식중
nested loop 방식과 merge join 의 차이를 물으셨군요.
두 방식은 각 DBMS의 알고리즘에 따라 혹은 사용자의 강제에 따라
인덱스를 사용하는 방식인데요.
별거 없고요.
select * from table where a=1 and b=2;
라고 하였을때 a,b칼럼에 대해 각각의 인덱스가 생성되어 있다면
네스티드 루프는 a 인덱스에서 1을 찾고 그 녀석들중에서 b가 2인
놈들을 찾습니다. 즉 a=1 인 OID 를 모은다음 그 oid를 가지고
B=2인지 하나하나 찾아갑니다. loop를 돈다는 것이 그이야기임.
반면, merge join은 a용 인덱스에서 1인 넘을 다 긁어옵니다.
b용 인덱스에서 2인 놈을 다 긁어옵니다. 둘 다에 속해있는 넘을 찾습니다.
결과를 냅니다.
사족으로 얼핏 보아서는 merge join이 빨라 보인다고요? 혹은 반대라고요.
만일 10만 레코드중 a=1인 넘이 고작 2개이고, b=2인 넘이 그중 하나도 없다면 nested loop로 2개 rowid만 끄집어 내서 인덱스로 가뿐하게 비교하고
끝납니다.
반면, 같은 경우에 10만 레코드중 1만개가 b=2라면, a=1인거 두개 뽑고
b=2인거 1만개 뽑아서 merge 한다면 물론 merge야 두줄이니 별거 아닙니다만 1만개 뽑는게 큰일이겠지요.
또 다시 생각해보면, nested join 의 경우에 b=2인 넘 1만개를 찾아서 각각 이것이 2인지 아닌지 인덱스를 뒤지면 고작 2줄 뒤지려고 1만번 loop를 돌죠.
이게 우스워 보이지만 이퀄이 아니라 범위이고 이러면 성능차이가
팍팍 납니다.
|