필자는 문제를 일으키기 위해 SQL 튜닝에 대해 충분히 알고 있습니다. 오늘 나는 질의에 대한 EXPLAIN 계획을 세우고 있었고 아마 그것이해야한다고 생각할 때 인덱스를 사용하지 않는 것으로 나타났습니다. 글쎄, 난 내가이 즉시 반환 확실히 생각테이블의 고유 한 필드에 대한 인덱스는 select count (*)가 즉시 발생하도록 허용합니까? 왜 안되면?
select count(*) from table_name
에 EXPLAIN했다 때까지, 간단하고 단순한 (내 마음에 더 색인) 쿼리에 EXPLAIN하고 그 보관 인덱스의 사용을 보여줄 것입니다 설명 이 테이블에는 고유 한 row_id 열의 인덱스를 비롯하여 많은 인덱스가 있으므로 그러나 Explain 계획은 FULL 테이블 스캔을 보여 주 었으며 완료하는 데 몇 초가 걸렸습니다. (이 표에는 3 백만 행이 있습니다).
오라클이 전체 테이블 스캔을 수행하여이 테이블의 행을 계산하는 이유는 무엇입니까? 나는 오라클이 이미 고유 한 필드를 인덱싱하고 있으며 해당 테이블의 모든 삽입 및 업데이트를 추적해야하므로 어딘가에 행 수가 캐싱 될 것이라고 생각하고 싶습니다. 그렇지 않은 경우에도 전체 테이블을 스캔하는 것보다 전체 인덱스를 스캔하는 것이 더 빠르지 않습니까?
두 가지 이론이 있습니다. 이론 1은 인덱스가 어떻게 잘못 작동하는지 상상하고 있습니다. 이론 2는 오라클 설정의 일부 설정이나 매개 변수가 오라클의 쿼리 최적화 기능을 망치고 있다는 것입니다 (우리는 oracle 9i를 사용하고 있습니다). 누구나 나를 계몽시킬 수 있습니까?
거래에 대한 좋은 지적은 내 머리 속에 떠오르는 것보다 더 복잡해졌습니다. –