ANALYZE

ANALYZE

이 페이지는 SQLite의 ANALYZE 명령을 설명해요. 이 명령은 테이블과 인덱스의 통계 정보를 수집해서 sqlite_stat1 테이블에 저장하며, 쿼리 플래너가 최적의 실행 계획을 세울 수 있도록 도와줘요.

출처: 문서

본문

1. 개요

analyze-stmt:

ANALYZE schema-name . table-or-index-name schema-name index-or-table-name

(schema-name은 스키마 이름, table-or-index-name은 테이블 또는 인덱스 이름을 나타내는 자리표시자예요.)

ANALYZE 명령은 테이블과 인덱스에 대한 통계를 수집해서 데이터베이스의 내부 테이블에 저장해요. 쿼리 최적화 프로그램이 이 정보에 접근해서 더 나은 쿼리 계획을 세우는 데 활용할 수 있게 하는 것이 목적이에요. 인자를 주지 않으면 메인 데이터베이스와 부착된(attached) 모든 데이터베이스를 분석해요. 인자로 스키마 이름을 주면 해당 데이터베이스의 모든 테이블과 인덱스를 분석해요. 인자가 테이블 이름이면 해당 테이블과 그 테이블과 연관된 인덱스만 분석하고, 인자가 인덱스 이름이면 해당 인덱스 하나만 분석해요.

2. 권장 사용 패턴

ANALYZE 사용이 필수인 경우는 없어요. 하지만 애플리케이션이 실행 가능한 쿼리 계획이 많은 복잡한 쿼리를 수행한다면, ANALYZE를 실행해 두면 쿼리 플래너가 최적의 계획을 더 잘 선택할 수 있어요. 이는 일부 쿼리에서 상당한 성능 향상으로 이어질 수 있어요.

ANALYZE를 언제, 어떻게 실행할지에 대한 두 가지 권장 접근 방식이 다음 하위 섹션에 선호 순서대로 설명되어 있어요.

2.1. "PRAGMA optimize"를 주기적으로 실행

PRAGMA optimize 명령은 필요할 때 자동으로 ANALYZE를 실행

5. 대형 데이터베이스를 위한 근사 ANALYZE

기본적으로 ANALYZE는 모든 인덱스를 전체 스캔해요. 대형 데이터베이스에서는 느릴 수 있어요. 그래서 SQLite 3.32.0(2020-05-22)부터 PRAGMA analysis_limit 명령을 사용해서 ANALYZE가 수행하는 스캔량을 제한할 수 있으며, 이를 통해 아주 큰 데이터베이스 파일에서도 ANALYZE가 더 빨리 실행되도록 할 수 있어요. 이를 "근사 ANALYZE" 실행이라고 불러요.

analysis_limit 프래그마의 권장 사용 패턴은 다음과 같아요.

PRAGMA analysis_limit=1000;

이 프래그마는 ANALYZE 명령이 평소처럼 인덱스의 전체 스캔을 시작하도록 지시해요. 그러나 방문한 행 수가 1000(또는 프래그마로 지정된 다른 한도)에 도달하면 ANALYZE 명령은 스캔을 중지하기 위한 조치를 취하기 시작해요. 인덱스의 맨 왼쪽 열이 지난 1000단계 동안 한 번이라도 변경되었다면 분석은 즉시 중지돼요. 그러나 맨 왼쪽 열이 항상 동일했다면 ANALYZE는 맨 왼쪽 열이 다른 첫 번째 항목으로 건너뛰어 추가로 1000행을 읽은 후 종료해요.

앞 단락에서 설명한 분석 한도의 효과에 대한 세부 사항은 향후 SQLite 버전에서 변경될 수 있어요. 그러나 핵심 아이디어는 동일하게 유지돼요. 분석 한도 N은 각 인덱스에서 방문하는 행 수를 대략 N으로 제한하려고 해요.

N 값은 100~1000 사이를 권장해요. 또는 분석 한도를 비활성화해서 ANALYZE가 각 인덱스를 완전히 스캔하도록 하려면 분석 한도를 0으로 설정하세요. 분석 한도의 기본값은 이전 버전과의 호환성을 위해 0이에요.

근사 ANALYZE가 sqlite_stat1 테이블에 넣는 값은 제한 없는 분석이 계산했을 값과 정확히 같지는 않아요. 그러나 대개 충분히 가까워요. 어차피 sqlite_stat1 테이블의 인덱스 통계는 근사치이므로, 근사 ANALYZE의 결과가 전통적인 전체 스캔 ANALYZE와 약간 다르다는 것은 실질적인 영향이 거의 없어요. 근사 ANALYZE가 전체 스캔 ANALYZE보다 눈에 띄게 나쁜 병적(pathological) 사례를 구성할 수는 있지만, 실제 문제에서 그러한 경우는 드물어요.

경험상 좋은 규칙은 ANALYZE를 실행하기 전에 N을 100~1000 사이로 하여 "PRAGMA analysis_limit=N"을 항상 설정하는 것 같아요. 예전에는 "PRAGMA optimize"를 실행하기 전에도 이렇게 설정하는 것이 권장되었지만, 버전 3.46.0(2024-05-23)부터는 자동으로 수행돼요. PRAGMA analysis_limit을 사용하면 결과가 그렇게 정밀하지는 않지만 충분히 정밀하며, 결과가 훨씬 빠르게 계산되기 때문에 개발자들이 계산할 가능성이 더 높아요. 근사 ANALYZE는 ANALYZE를 전혀 실행하지 않는 것보다 나아요.

5.1. 근사 ANALYZE의 제한 사항

sqlite_stat4 테이블의 내용은 전체 스캔 없이는 계산할 수 없어요. 따라서 0이 아닌 분석 한도가 지정되면 sqlite_stat4 테이블은 계산되지 않아요.

이 페이지는 2026-04-21 10:28:59Z에 마지막으로 업데이트되었습니다.

더 알아보기 (Learn more)