Может показаться, что для каждой строки есть псевдоним для rowid байта (я думаю), который, как мне кажется, объясняется следующим образом: -
Когда таблица SQL включаетстолбец INTEGER PRIMARY KEY (который содержит псевдоним rowid), затем этот столбец появляется в записи как значение NULL.SQLite всегда будет использовать ключ b-дерева таблицы, а не значение NULL при обращении к столбцу INTEGER PRIMARY KEY. Формат файла базы данных - 2.3.Представление таблиц SQL .
1 байт на строку выглядит довольно близко в соответствии со следующим тестированием: -
Были созданы две базы данных с двумя разными таблицами,загружено 1 000 000 миллионов строк с использованием следующего SQL: -
для первого: -
DROP TABLE IF EXISTS points;
CREATE TABLE IF NOT EXISTS points (tags BLOB NOT NULL, lon INTEGER NOT NULL, lat INTEGER NOT NULL);
WITH RECURSIVE counter(tags,lon,lat) AS (SELECT x'00000000', 0,0 UNION ALL SELECT tags, random() AS lon, random() AS lat FROM counter LIMIT 1000000)
INSERT INTO points (tags,lon,lat) SELECT * FROM counter;
SELECT * FROM points;
VACUUM
для второго (с псевдонимом rowid): -
DROP TABLE IF EXISTS points;
CREATE TABLE IF NOT EXISTS points (id INTEGER PRIMARY KEY, tags BLOB NOT NULL, lon INTEGER NOT NULL, lat INTEGER NOT NULL);
WITH RECURSIVE counter(tags,lon,lat) AS (SELECT x'00000000', 0,0 UNION ALL SELECT tags, random() AS lon, random() AS lat FROM counter LIMIT 1000000)
INSERT INTO points (tags,lon,lat) SELECT * FROM counter;
SELECT * FROM points;
VACUUM
Результирующие размеры файлов составляли 29484 КБ и 30600 КБ соответственно.
При разнице 30600 - 29484 = 1116 умножьте это на 1024 = 1142784 (не так уж далеко от 1 000 000 строк, страниц и свободного пространства, вероятно,с учетом расхождений).
- Обратите внимание, что команда VACUUM не изменила (поскольку они были новыми таблицами, не ожидалось, что они будут).