로우ID 테이블
로우ID 테이블 (Rowid Tables)
이 문서는 SQLite의 "rowid table"(로우ID 테이블)이 무엇인지, 그리고 그와 관련된 특이한 점들을 설명해요.
출처: 문서
본문
1.0 정의 (Definition)
"rowid table"은 SQLite 스키마의 테이블 중에서
- 가상 테이블이 아니고,
- WITHOUT ROWID 테이블도 아닌
모든 테이블을 말해요.
일반적인 SQLite 데이터베이스 스키마에 있는 대부분의 테이블은 rowid 테이블이에요.
Rowid 테이블은 모두 고유하고, NULL이 아니며, 부호 있는 64비트 정수인 rowid를 가진다는 점이 특징이에요. 그 rowid는 내부 B-tree 저장 엔진에서 데이터의 접근 키로 사용돼요.
2.0 특이한 점 (Quirks)
-
Rowid 테이블의 PRIMARY KEY(있는 경우)는 보통 그 테이블의 진짜 기본 키가 아니에요. 즉 내부 B-tree 저장 엔진이 사용하는 고유 키가 아니라는 뜻이에요. 이 규칙의 예외는 rowid 테이블이 INTEGER PRIMARY KEY를 선언한 경우예요. 이 예외에서 INTEGER PRIMARY KEY는 rowid의 별명이 돼요.
-
Rowid 테이블의 진짜 기본 키(내부 B-tree 저장 엔진에서 행을 찾는 데 사용되는 값)는 rowid예요.
-
Rowid 테이블의 PRIMARY KEY 제약(진짜 기본 키나 INTEGER PRIMARY KEY가 아닌 한)은 사실 UNIQUE 제약과 같은 것이에요. 진짜 기본 키가 아니므로 PRIMARY KEY의 열은 NULL이 허용되며, 이는 모든 SQL 표준을 위반하는 것이에요.
-
Rowid 테이블의 rowid는 "rowid"나 "oid"나 "rowid" 열들 중 아무 것이나 읽거나 써서 접근(또는 변경)할 수 있어요. 단, 테이블에 그 특수 이름들 중 하나를 사용하는 선언된 열이 있다면, 그 이름들은 내부 rowid가 아니라 선언된 열을 가리켜요.
-
rowid를 통한 레코드 접근은 고도로 최적화되어 매우 빨라요.
-
rowid가 INTEGER PRIMARY KEY로 별명을 달지 않았다면, 그것은 영구적이지 않고 바뀔 수 있어요. 특히 VACUUM 명령은 INTEGER PRIMARY KEY를 선언하지 않은 테이블의 rowid를 바꿔요. 따라서 응용 프로그램은 보통 rowid를 직접 접근하지 말고 INTEGER PRIMARY KEY를 사용해야 해요.
-
내부 파일 형식에서 각 rowid는 가변 길이 정수로 저장돼요. 즉 작은 음이 아닌 rowid 값은 크거나 음수인 rowid 값보다 디스크 공간을 덜 차지해요.
-
위의 모든 복잡함(그리고 여기에 언급되지 않은 다른 것들)은 유통 중인 수천억 개의 SQLite 데이터베이스 파일에 대한 하위 호환성을 유지해야 할 필요에서 비롯됐어요. 완벽한 세상이라면 "rowid" 같은 것은 없고 모든 테이블이 WITHOUT ROWID 테이블로 구현된 표준 의미론을 따르되, "WITHOUT ROWID" 키워드만 없는 상태일 거예요. 불행히도 삶은 복잡해요. SQLite의 설계자는 현재의 어수선한 상태에 대해 진심으로 사과해요.