Bytecode() 와 Tables_Used() 테이블-값 함수

Bytecode() 와 Tables_Used() 테이블-값 함수

bytecode와 tables_used는 SQLite에 내장된 가상 테이블(virtual table)로, 준비된 문(prepared statement)에 대한 정보를 들여다볼 수 있게 해 줘요. 둘 다 테이블-값 함수(table-valued function)로 동작한답니다.

출처: The Bytecode() And Tables_Used() Table-Valued Functions

본문

1. 개요 (Overview)

bytecode와 tables_used는 SQLite에 내장된 가상 테이블로, 준비된 문에 대한 정보에 접근해요. bytecode와 tables_used 모두 테이블-값 함수로 동작해요. 둘 다 필수 인자를 하나 받는데, 그 인자는 SQL 문의 텍스트이거나 기존 준비된 문에 대한 포인터예요. bytecode 함수는 준비된 문 안의 bytecode 연산 하나마다 결과 행을 하나씩 반환해요. tables_used 함수는 준비된 문이 접근하는 각각의 영속적인 btree(테이블이든 인덱스든)마다 행을 하나씩 반환해요.

2. 사용법 (Usage)

bytecode와 tables_used 테이블은 SQLite가 -DSQLITE_ENABLE_BYTECODE_VTAB 컴파일 타임 옵션으로 컴파일된 경우에만 사용할 수 있어요. CLI는 그렇게 컴파일되어 있어서, 표준 CLI를 테스트 플랫폼으로 삼아 실험해 볼 수 있어요.

두 가상 테이블 모두 읽기 전용 eponymous-only 가상 테이블이에요. SELECT 문의 FROM 절에 직접 언급해서 사용하면 돼요. 둘 다 분석할 SQL 문 하나를 인자로 받아요. 예를 들어:

SELECT * FROM bytecode('SELECT * FROM bytecode(?1)');

인자는 SQL 문의 텍스트일 수 있는데, 그러면 그 문에 대한 bytecode(또는 tables_used)가 반환돼요. 아니면 인자가 ?1이나 $stmt 같은 매개변수일 수도 있는데, 이 경우 나중에 sqlite3_bind_pointer() 인터페이스를 통해 준비된 문 객체에 바인딩돼요. sqlite3_bind_pointer() 인터페이스에는 포인터 타입으로 "stmt-pointer"를 사용해요.

2.1. bytecode 의 스키마 (Schema For bytecode)

bytecode 가상 테이블의 스키마는 다음과 같아요:

CREATE TABLE bytecode(
  addr INT,
  opcode TEXT,
  p1 INT,
  p2 INT,
  p3 INT,
  p4 TEXT,
  p5 INT,
  comment TEXT,
  subprog TEXT,
  nexec INT,
  ncycle INT,
  stmt HIDDEN
);

처음 여덟 개의 컬럼은 문을 구현하는 가상 머신 안의 단일 bytecode에 대한 주소, opcode, 피연산자들이에요. 이 컬럼들은 EXPLAIN을 사용할 때 출력되는 컬럼과 같아요.

bytecode 가상 테이블은 준비된 문 안의 모든 연산을 보여줘요. 준비된 문의 본문뿐 아니라 트리거나 외래 키 동작을 구현하는 데 쓰이는 서브프로그램까지요. "subprog" 필드는 준비된 문 본문에서는 NULL이고, 트리거에서는 트리거 이름, 외래 키 동작에서는 "(FK)" 문자열이 돼요.

"nexec"와 "ncycle" 컬럼은 각 opcode가 실행된 횟수와 그 opcode가 사용한 총 CPU 사이클 수를 보여줘요. 이 필드는 SQLite가 SQLITE_ENABLE_STMT_SCANSTATUS 컴파일 타임 옵션으로 컴파일되고, sqlite3_db_config(db, SQLITE_DBCONFIG_STMT_SCANSTATUS, ...) 인터페이스로 스캔-상태 통계가 활성화된 경우에만 0이 아닌 값을 가져요. nexec와 ncycle의 값은 sqlite3_stmt_scanstatus_reset()으로 초기화하기 전까지 누적돼요.

"ncycle" 컬럼은 현재 SQLite가 GCC·Clang·MSVC로 X86_64나 AARCH64 프로세서용으로 컴파일되거나, GCC·Clang으로 PPC 프로세서용으로 컴파일된 경우가 아니면 항상 0을 반환해요.

2.2. tables_used 의 스키마 (Schema For tables_used)

tables_used 테이블의 스키마는 다음과 같아요:

CREATE TABLE tables_used(
  type TEXT,
  schema TEXT,
  name TEXT,
  wr INT,
  subprog TEXT,
  stmt HIDDEN
);

tables_used 테이블은 준비된 문이 데이터베이스 파일의 어느 btree를 읽거나 쓰는지 보여주는 용도예요. 주 문 자체뿐 아니라 관련 트리거와 외래 키 동작까지 포함해요. 컬럼은 다음과 같아요:

  • type → btree가 어떤 역할을 하는지에 따라 "table" 또는 "index".
  • schema → btree가 위치한 데이터베이스 파일. 메인 데이터베이스(일반적인 경우)면 "main", TEMP 테이블과 인덱스면 "temp", 아니면 ATTACH 문으로 부착(attached)된 데이터베이스에 부여한 이름.
  • name → 테이블이나 인덱스의 이름.
  • wr → 객체가 읽히면 0, 쓰이면 1.
  • subprog → 객체가 접근된 서브프로그램. NULL은 준비된 문의 본문을 뜻하고, 그 외에는 트리거 이름이거나 외래 키 동작의 "(FK)"예요.

더 알아보기 (Learn more)