2012-08-02 2 views
1

그래서이 쿼리가 있다고 가정 : 표 1에 ID에 대한 인덱스가있는 경우자기 참조에 대한 쿼리 속도를하는 방법이

SELECT * FROM table1 A, table1 B where A.id = B.id; 

도, 여전히 전체 테이블을 스캔 할 것을 ...입니다 전체 테이블을 검사하지 않도록 속도를 높이는 방법이 있습니까?

+1

테이블의 모든 레코드가 기준을 충족하므로 전체 테이블을 스캔합니다. 나는 이것이 당신의 실제 문제의 단순화라고 생각하지만, 당신이 너무 단순 해졌고 더 이상 좋은 표현이 아닌 것 같아요. – invertedSpear

+0

"table1에 id에 대한 색인이 있어도 여전히 전체 표를 검색합니다 ..."--- 예, 'table1'에서 모든 항목을 선택했기 때문입니다. "전체 테이블을 스캔하지 않도록 속도를 향상시키는 방법이 있습니까?"--- "where where where"를 추가하십시오. – zerkms

+0

"id"가 NULL입니까? 이것이 필터 역할을하는 경우입니다. –

답변

0

실행 계획이 내 앞에 있지 않지만 실제로는 TableA 만 스캔하는 것이므로 그 이유는 TableA에 다른 조건이 없기 때문입니다. 지금은 통계이기 때문에 이번에 TableB을 찾아야합니다. 이제 TableA에 대해 다른 조건을 제공하고 해당 조건이 색인을 충족 시키면 전체 표를 검색하지 않는 것입니다.

TableA의 인덱스가 쿼리의 커버 된 인덱스 인 경우 실제로는 심지어 TableA의 데이터 페이지도 읽지 않습니다.

TableATableB 사이에 외래 키 제약 조건이 있고 id 필드보다 TableB에서 더 이상 읽지 않은 경우 데이터 페이지를 읽지 않을 것입니다.

TableB의 데이터가 필요하더라도 해당 데이터가 색인에 있다면 데이터 페이지를 읽을 필요가 없습니다.

하지만 마지막으로 *을 선택 했으므로 두 테이블 모두 모두의 모든 열을 선택하기 때문에 매우 효율적인 쿼리가 될 것 같지 않습니다.

너무 길지 않았 으면 좋겠지 만, 내가 어디에서 왔는지 알고 싶었습니다.