2010-04-09 2 views
1

그래서 해시를 만들 것인지 알고 싶습니다. 두 테이블 간의 조인은 전체 테이블을 collumns로 스캔하는 데 필요합니까?해시 가입이 필요합니다 전체 테이블 스캔

COL1과 COL2가 더 작기를 원하면 COL1에서 전체 스캔을 수행하여 해시 맵을 작성한 다음 sabe 해시 기능을 사용하여 COL2에서 전체 스캔을 작성합니다.

이 정보가 맞습니까?

답변

1

모든 데이터베이스는 Hash Join을 실제로 구현할 수 있습니다. 그러나 I의 가능성 방법 this

해시 알고리즘 가입

비슷 말할 것 것은 작은 의 두 개의 입력의 메모리 해시 테이블을 구축하고 큰 입력을 판독하고있는 프로브 - 메모리 일치 항목을 찾으려면 해시 테이블이 있으며, 이는 작업 테이블에 작성된 입니다. 작은 입력이 메모리에 맞지 않으면 해시 조인 연산자 은 두 입력을 더 작은 작업 테이블로 분할합니다. 이 작은 작업 테이블 은 작은 입력이 메모리에 맞을 때까지 재귀 적으로 처리됩니다. 질문에 관해서는

: 또한 데이터베이스와 얼마나 잘 일을 최적화 할 수 있습니다에 따라 is necessary to make a full table scan on the collumns

내가 더 말할 것입니다. 쿼리에서 두 테이블 중 하나의 행을 제한하기에 충분한 조건이 있으면 해시 병합 알고리즘을 사용하기 전에 해당 행을 끌어옵니다.

in-memory hash table of the smaller of its two inputs을 빌드하면 최상의 방법 (테이블 스캔 일 필요는 없음)을 사용하여 테이블에서 해당 행을 가져옵니다. 이 테이블의 행을 줄이기 위해 쿼리에 조건이 없으면 테이블 스캔을 수행합니다.

then reads the larger input and probes the in-memory hash table to find matches 일 때 가장 좋은 방법을 사용하여 해당 행을 가져옵니다. 이는 반드시 테이블 스캔이 아닙니다.

는 쿼리 인 경우 :

SELECT 
    * 
    FROM BigTable 
     INNER JOIN LittleTable ON BigTable.Col=LittleTable.Col 

와 해시를 사용하는 가입, 그것은 가장 가능성이 테이블 스캔을 수행하여 LittleTable에서 메모리에 해시 테이블을 생성합니다 다음 표는 빅 테이블들에 대해 체크를 스캔 해시 키.

는 쿼리 인 경우 :

SELECT 
    * 
    FROM BigTable 
     INNER JOIN LittleTable ON BigTable.Col=LittleTable.Col 
    WHERE LittleTable.Col2 >'2010/01/01' AND LittleTable.Col2<'2010/01/31' 

와 해시를 사용하는 가입, 사용할 수있는 인덱스가 존재하는 경우가 대부분합니다 (LittleTable에서 메모리에 해시 테이블을 생성하지만 테이블 스캔을 사용하지 않습니다) 그런 다음 해시 키에 대해 테이블 ​​스캔 BigTable 검사를 수행합니다. BigTable에서 테이블 검색을 변경하려면 필터를 추가하십시오.

+0

한 가지를 명확히 할 수 있습니까? 거대한 테이블에서 해시 조인을 사용한다는 것을 읽었습니다. BigTable에 100m 레코드가 있고 LittleTable에 100 개의 레코드 만 들어 있다고 가정 해 보겠습니다. 해시 조인을 사용하겠습니까? 그리고 만약 그것이 : 100m 레코드 전체에 걸쳐 전체 반복이 컬럼이 해시 테이블에 나타나는지를보기 위해 정기적으로 색인 된 검색에 비해 낭비가되는 것은 아닌가? 또는 나는 무엇인가 놓치고 있냐? –

+0

@mrhobo, 귀하의 데이터 및 쿼리와 관련된 모든 세부 정보를 포함하는 자체 질문을하십시오. 당신은 코멘트에 입력 할 수있는 것보다 훨씬 좋은 답을 얻을 수 있습니다. –