SQLITE_STMT 가상 테이블

SQLITE_STMT 가상 테이블 (The SQLITE_STMT Virtual Table)

개요 (Overview)

SQLITE_STMT 확장은 데이터베이스 연결과 연관된 모든 준비된 문(prepared statement)에 대한 정보를 제공하는 에포니머 전용 가상 테이블을 구현해요.

SQLITE_STMT 확장은 amalgamation에 포함되지만 기본적으로는 비활성화돼요. SQLITE_ENABLE_STMTVTAB 컴파일 타임 옵션을 사용해 SQLITE_STMT 확장을 활성화해요. SQLITE_STMT 확장은 https://sqlite.org/src/file/ext/misc/stmt.c의 소스 코드를 사용해 확장을 공유 라이브러리나 DLL로 컴파일하고 로더블 확장을 컴파일하는 방법에 대한 지침을 따르면 런타임에도 로드할 수 있어요.

SQLITE_STMT 확장은 명령줄 셸의 기본 빌드에서 활성화돼요.

출처: 문서

본문

사용법 (Usage)

SQLITE_STMT 가상 테이블은 읽기 전용 테이블로, 직접 질의해 현재 데이터베이스 연결의 모든 준비된 문에 대한 정보를 접근할 수 있어요. 예를 들어:

SELECT * FROM sqlite_stmt;

위와 같은 명령문은 sqlite3_close()를 호출하기 직전에 실행하여 모든 준비된 문이 finalize됐는지 확인하고, "누수"되어 finalize되지 못한 준비된 문을 식별하고 추적하는 데 도움이 될 수 있어요.

SQLITE_STMT 가상 테이블은 애플리케이션 최적화를 돕기 위해 준비된 문에 대한 성능 정보를 접근하는 데도 사용될 수 있어요. 예를 들어 결코 사용되지 않은 준비된 문이 얼마나 많은 메모리를 사용하는지 알아내려면 다음을 실행할 수 있어요.

SELECT sum(mem) FROM sqlite_stmt WHERE run=0;

1. 열 (Columns)

SQLITE_STMT 가상 테이블이 제공하는 열은 여기 보여지는 가상의 CREATE TABLE 문으로 요약돼요.

CREATE TABLE sqlite_stmt(
  sql    TEXT,    -- Original SQL text
  ncol   INT,     -- Number of output columns
  ro     BOOLEAN, -- True for "read only" statements
  busy   BOOLEAN, -- True if the statement is current running
  nscan  INT,     -- Number of full-scan steps
  nsort  INT,     -- Number of sort operations
  naidx  INT,     -- Number of automatic index inserts
  nstep  INT,     -- Number of byte-code engine steps
  reprep INT,     -- Number of reprepare operations
  run    INT,     -- Number of times this statement has been run
  mem    INT      -- Heap memory used by this statement
);

향후 릴리스에서는 새 출력 열을 추가하고 이전 열의 순서를 바꿀 수 있어요. SQLITE_STMT 가상 테이블의 각 열 의미에 대한 추가 세부 사항은 아래에 제공돼요.

  • sql: 준비된 문의 원래 SQL 텍스트예요. 준비된 문이 sqlite3_prepare() 인터페이스를 사용해 컴파일된 경우 SQL 텍스트가 저장되지 않았을 수 있으며, 이 경우 이 열은 NULL이 돼요.
  • ncol: 쿼리 결과 집합의 열 수예요. DML 문의 경우 이 열의 값은 0이에요.
  • ro: "읽기 전용" 열이에요. SQL 문이 쿼리이면 이 열은 참(0이 아닌 값)이고, DML 문이면 거짓(0)이에요.
  • busy: 준비된 문이 현재 실행 중이면 이 필드는 참이에요. 즉 준비된 문sqlite3_step()이 한 번 이상 호출됐지만 sqlite3_reset()으로 아직 재설정되지 않았다면 이 필드는 참이에요.
  • nscan: 바이트코드 엔진이 전체 테이블 스캔의 일부로 테이블을 몇 번 거쳤는지의 횟수예요. 이 필드가 큰 수면 인덱스를 추가해 성능을 개선할 여지가 있음을 나타낼 수 있어요. 이 필드는 SQLITE_STMTSTATUS_FULLSCAN_STEP 값과 동일해요.
  • nsort: 바이트코드 엔진이 정렬을 수행해야 했던 횟수예요. 이 필드의 양수 값은 쿼리 결과가 자연스럽게 원하는 순서로 나타나게 하는 인덱스를 추가해 성능을 개선할 여지가 있음을 나타낼 수 있어요. 이 필드는 SQLITE_STMTSTATUS_SORT 값과 동일해요.
  • naidx: 자동 인덱스에 삽입된 행 수예요. 이 필드의 양수 값은 자동 인덱스를 대신하는 명명된 인덱스를 추가해 성능을 개선할 여지가 있음을 나타낼 수 있어요. 이 필드는 SQLITE_STMTSTATUS_AUTOINDEX 값과 동일해요.
  • nstep: 준비된 문에 대해 수행된 바이트코드 엔진 연산 수예요. 이 필드는 문이 사용한 CPU 시간의 대용 지표로 사용될 수 있어요. 이 필드는 SQLITE_STMTSTATUS_VM_STEP 값과 동일해요.
  • reprep: 스키마 변경이나 매개변수 바인딩 변경으로 인해 문을 다시 준비(reprepared)해야 했던 횟수예요. 이 필드는 SQLITE_STMTSTATUS_REPREPARE 값과 동일해요.
  • run: 문이 실행된 횟수예요. 이 필드는 SQLITE_STMTSTATUS_RUN 값과 동일해요.
  • mem: 준비된 문이 사용하는 힙 저장소의 바이트 수예요. 이 필드는 SQLITE_STMTSTATUS_MEMUSED 값과 동일해요.

더 알아보기 (Learn more)