WITH OUT ROWID仅在SQLite中找到,不兼容据我们所知,使用任何其他SQL数据库引擎。在一个优雅的系统中,所有表都将表现为WITH OUT ROWID表,即使没有WITH OUT ROWID关键字。然而,当SQLite最初设计时,它只使用整数划艇用于行键以简化实现。多年来,这种方法运行良好。但作为对SQLite增长了,对PRIMARY KEY真正起作用的表的需求增加了与底层行键相对应变得更加尖锐。不带ROWID的添加了概念为了在不倒退的情况下满足需求与数十亿已在使用的SQLite数据库兼容时间(约2013年)。
2与普通Rowid表的差异
WITH ROWID语法是一种优化。它没有提供新的能力。使用WITH OUT ROWID表可以完成的任何操作也可以用完全相同的方式,完全相同的语法,使用普通的rowid表。无ROWID的唯一优势表是它有时可以使用较少的磁盘空间和/或执行少量操作比普通的rowid表更快。
每个WITH OUT ROWID表都必须有一个PRIMARY KEY。尝试创建WITHOUT ROWID表,但没有PRIMARY KEY结果出现错误。
相关的特殊行为”集成主键“不适用在WITH OUT ROWID表格上。在普通表中,“INTEGER PRIMARY KEY”表示该列是rowid的别名。但由于WITH OUT rowid中没有rowid表中的特殊含义不再适用。“整数主键”WITH OUT ROWID表中的列有效就像普通表中的“INT PRIMARY KEY”列:它是一个PRIMARYKEY有整数的密切关系.
自动更正不适用于WITH OUT ROWID表。这个自动更正机制假定存在rowid,因此它不适用于WITH OUT ROWID表。如果“AUTOINCREMENT”关键字在CREATE TABLE语句中用于a WITH OUT ROWID表格。
WITH OUT ROWID优化可能对表有帮助具有非整数或复合(多列)主键且不存储大字符串或BLOB。
没有ROWID表将正常工作(也就是说提供正确答案)。然而,在这种情况下,普通的rowid表将运行得更快。因此,这是一个很好的设计避免使用单列PRIMARY KEY创建with OUT ROWID表INTEGER类型。
当单个行不太大时,WITH OUT ROWID表工作得最好。一个很好的操作规则是WITH OUT ROWID表格的大小应小于数据库页面。这意味着行中包含的内容不应超过大约对于1KiB页面大小,每个字节为50字节;对于4KiB,每个字节约为200字节页面大小。WITH OUT ROWID表格将起作用(从这个意义上说他们得到了正确的答案),用于任意大的行-最大2GB-但传统的rowid表对于较大的行大小往往工作得更快。这是因为rowid表实现为B*-树木哪里所有内容都存储在树的叶子中,而没有ROWID表是使用普通的B树实现的,其内容存储在叶和中间节点。将内容存储在中间节点导致每个中间节点条目占用更多空间页面上的空间,从而减少扇出,增加搜索成本。
请注意,除了上面详述的几个拐角处的差异外,WITH OUT ROWID表和ROWID表的工作原理相同。它们都产生相同的答案给出了相同的SQL语句。所以这很简单在开发周期后期对应用程序运行实验,测试使用WITH OUT ROWID表是否有帮助。一个好的策略是在没有ROWID的情况下不必担心产品开发结束,然后返回并运行测试以查看如果将with OUT ROWID添加到具有非整数PRIMARY KEY的表中有帮助或影响性能,仅在这种情况下保留WITH OUT ROWID有帮助的地方。