ANALYZE
ANALYZE 문은 테이블과 인덱스의 내용에 대한 통계를 수집해요. 수집한 통계는 쿼리 옵티마이저가 더 나은 쿼리 계획을 고르는 데 쓰여요.
출처: 문서
본문
ANALYZE 문은 테이블과 인덱스의 내용에 대한 통계를 수집해요. 쿼리 옵티마이저는 이 통계를 활용해서 더 나은 쿼리 계획을 고르고, 특히 어떤 인덱스를 쓸지, 조인을 어떤 순서로 처리할지 결정할 때 도움을 받아요.
문법
ANALYZE;
ANALYZE schema-name;
ANALYZE [schema-name.]table-or-index-name;
설명
ANALYZE 문은 인덱스 안 값의 분포에 대한 통계를 모아서 sqlite_stat1 테이블에 저장해요 (선택적으로 sqlite_stat4에도). 쿼리 옵티마이저는 이 통계를 읽고 다음 사항에 대한 더 나은 결정을 내려요:
- 쿼리에 어떤 인덱스를 쓸지
- 조인에서 테이블을 어떤 순서로 처리할지
- 인덱스를 쓸지, 아니면 테이블 전체 스캔을 할지
형태
| 형태 | 설명 |
|---|---|
ANALYZE |
붙어 있는(attached) 모든 데이터베이스의 모든 테이블과 인덱스를 분석 |
ANALYZE schema-name |
지정한 데이터베이스의 모든 테이블과 인덱스를 분석 |
ANALYZE table-name |
지정한 테이블의 모든 인덱스를 분석 |
ANALYZE index-name |
지정한 인덱스를 분석 |
예제
모든 테이블 분석하기
-- Collect statistics for the entire database
ANALYZE;
특정 테이블 분석하기
CREATE TABLE orders (
id INTEGER PRIMARY KEY,
customer_id INTEGER,
product_id INTEGER,
amount REAL
);
CREATE INDEX idx_customer ON orders(customer_id);
CREATE INDEX idx_product ON orders(product_id);
-- Collect statistics for the orders table and its indexes
ANALYZE orders;
통계 보기
통계는 sqlite_stat1 테이블에 저장돼요:
SELECT * FROM sqlite_stat1;
-- tbl | idx | stat
-- orders | idx_customer | 1000 50
-- orders | idx_product | 1000 10
stat 컬럼에는 공백으로 구분된 정수들이 들어 있어요. 첫 번째 정수는 테이블의 전체 행 수예요. 이후 정수들은 인덱스의 왼쪽 N개 컬럼이 같은 값을 공유하는 행의 평균 개수를 추정한 거예요.
더 알아보기 (Learn more)
- CREATE INDEX - 인덱스 만들기
- EXPLAIN - 쿼리 계획 살펴보기