본문 바로가기
WIKI 기술 지식 베이스

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)