UNION 가상 테이블

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

UNION 가상 테이블(이하 "union-vtab")은 여러 독립적인 rowid 테이블을 하나의 큰 테이블처럼 보이게 만드는 가상 테이블이에요. 같은 데이터베이스 파일에 있을 수도, 같은 데이터베이스 연결에 ATTACH된 별도의 데이터베이스 파일에 있을 수도 있어요. 이 문서는 union-vtab의 개요, 생성 방법, 제약 사항을 설명해요.

출처: 문서

본문

  • UNION 가상 테이블(이하 "union-vtab")은 여러 독립적인 rowid 테이블을 하나의 큰 테이블처럼 보이게 만드는 가상 테이블이에요.

  • union-vtab에 참여하는 테이블은 같은 데이터베이스 파일에 있을 수도, 같은 데이터베이스 연결에 ATTACH된 별도의 데이터베이스 파일에 있을 수도 있어요.

  • union-vtab은 SQLite에 내장되어 있지 않아요. Union-vtab은 로드 가능 확장(loadable extension)이에요. union-vtab의 소스 코드는 SQLite 소스 트리의 ext/misc/unionvtab.c에 있는 단일 파일에 포함돼 있어요.

  • 새 union-vtab 인스턴스는 다음과 같이 생성돼요:

CREATE VIRTUAL TABLE temp.tabname USING unionvtab(query);
  • 모든 union-vtab은 TEMP 네임스페이스에 있어야 해요. 따라서 tabname 앞의 "temp."가 필요해요. union-vtab 자체만 TEMP 네임스페이스에 있으면 되고, union되는 개별 테이블은 어떤 ATTACH된 데이터베이스도 될 수 있어요.

  • union-vtab의 CREATE VIRTUAL TABLE 문의 쿼리는 네 개의 컬럼과 임의의 수의 행을 반환하는 잘 구성된 SQL 쿼리여야 해요. 쿼리 결과의 각 행은 union에 참여할 단일 테이블을 나타내요.

  • 첫 번째 컬럼은 테이블을 포함하는 데이터베이스의 스키마 이름이에요. 예: "main", "zone512".

  • 두 번째 컬럼은 테이블의 이름이에요.

  • 세 번째 컬럼은 테이블의 어떤 rowid에 대한 최소 값이에요.

  • 네 번째 컬럼은 테이블의 어떤 rowid의 최대 값이에요.

  • union-vtab의 CREATE VIRTUAL TABLE 문의 쿼리는 SELECT 문이거나 VALUES 절일 수 있어요.

  • 쿼리는 CREATE VIRTUAL TABLE 문이 처음 만났을 때 한 번 실행되고, 그 한 번 실행의 결과가 union-vtab에 대한 모든 후속 접근에 사용돼요. 쿼리의 결과가 바뀌면, 쿼리가 다시 실행되도록 union-vtab을 DROP하고 다시 만들어야 해요.

  • union-vtab의 다양한 테이블에 대한 rowid 밴드(band) 간에 겹침이 없어야 해요.

  • union-vtab에 참여하는 모든 테이블은 테이블 이름이 다를 수 있다는 점을 제외하고 동일한 CREATE TABLE 정의를 가져야 해요.

  • union-vtab에 참여하는 모든 테이블은 rowid 테이블이어야 해요.

  • tabname의 컬럼 이름과 정의는 기반 테이블과 같을 거예요. 애플리케이션은 tabname을 실제 기반 테이블 중 하나처럼 접근할 수 있어요.

  • union-vtab의 어떤 테이블도 CREATE VIRTUAL TABLE 문의 쿼리가 설정한 rowid 경계 밖에 있는 항목을 포함해서는 안 돼요.

  • union-vtab은 쿼리의 제약이 아래에 보인 형태 중 하나일 때 기반 실제 테이블에 대한 접근을 최적화해요. 다른 종류의 제약은 미래에 최적화될 수 있지만, 초기 구현에서는 이 제약만 최적화돼요.

    • rowid=$id
    • rowid IN query-or-list
    • rowid BETWEEN $lwr AND $upr

    다른 종류의 제약도 사용될 수 있고 작동하겠지만, 다른 제약은 각 행마다 개별적으로 검사되고 최적화되지 않아요(적어도 처음에는). 모든 제약 검사는 최적화가 발생하는지 여부와 관계없이 완전히 자동이에요. 이 글머리 기호에서 언급된 최적화는 성능 고려 사항일 뿐이에요. 쿼리가 최적화되는지 여부와 관계없이 같은 결과를 얻어요.

  • union-vtab은 읽기 전용이에요. 쓰기 지원은 나중에 추가될 수 있지만, 쓰기는 초기 구현의 일부가 아니에요.

  • 주의(Nota bene): sqlite3_blob_open() 인터페이스는 union-vtab에서 작동하지 않아요. BLOB 콘텐츠는 일반 SQL 문을 사용해 union-vtab에서 읽어야 해요.

더 알아보기 (Learn more)