首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >整数主键与SQLite中的rowid

整数主键与SQLite中的rowid
EN

Stack Overflow用户
提问于 2018-06-05 01:53:53
回答 1查看 1.9K关注 0票数 3

我正在尝试将一些空间数据(OSM)导入到SQLite数据库中。SQLite引用声明整数主键成为行is的别名(如果没有指定WITHOUT )。为了确认,我用两种不同的方式创建了我的主表:

代码语言:javascript
复制
CREATE TABLE points (tags BLOB NOT NULL,
                     lon INTEGER NOT NULL,
                     lat INTEGER NOT NULL)

代码语言:javascript
复制
CREATE TABLE points (id INTEGER PRIMARY KEY,
                     tags BLOB NOT NULL,
                     lon INTEGER NOT NULL,
                     lat INTEGER NOT NULL)

我期望得到相同的结果,但是在运行应用程序两次之后,我的两个数据库文件在大小上明显不同:显式主键的版本多占用大约100MB的磁盘空间(1.5 GB对1.4 GB)。我的insert语句是相同的,除了一个使用" ID ",另一个使用"rowid“作为点ID的目标列。

有谁知道这种巨大的尺寸差异是从哪里来的?提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-05 06:09:35

似乎每行一个字节的rowid (我认为)有一个别名的开销,我认为这可以用以下方式解释:-

当SQL表包含整数主键列(这是行in的别名)时,该列在记录中显示为NULL值。在引用整数主键列时,SQLite将始终使用表b树键,而不是空值。 Database File Format - 2.3. Representation Of SQL Tables

根据以下测试,每行1个字节似乎非常接近:

用这两个不同的表创建了两个数据库,使用以下SQL加载了1,000,000,000行:

第一项:

代码语言:javascript
复制
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的别名):-

代码语言:javascript
复制
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

生成的文件大小分别为29484Kb和30600Kb。

这就是30600 - 29484 = 1,116的差异,乘以1024 = 1142784 (与可能导致差异的1,000,000行、页和空闲空间相距不远)。

  • 注意,VACUUM命令没有任何区别(因为它们是新的表,所以不期望它们会有区别)。
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50686224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档