即使在阅读SQLite 限制之后,我也找不到SQLite 数据库文件可以容纳的最大表数。所以,我想知道是否
- SQLite 数据库可以容纳的最大表数是多少?
- SQLite 数据库文件中有数千个小表是个问题吗?
- SQLite 数据库文件中的许多表会影响查询的性能?
SQLite 中的限制列表记录在此页面。没有给定每个数据库的最大表数,因此 SQLite 可能没有实现限制。每个 JOIN 限制为 64 个表。
4. Join 中的最大表数
SQLite 不支持包含超过 64 个表的连接。这个限制是因为 SQLite 代码生成器在查询优化器中使用位图,每个连接表有一位。
SQLite 使用高效的查询计划器算法,因此即使是大型连接也可以快速准备。因此,没有任何机制可以提高或降低连接中表数的限制。
15. 模式中的最大表数
每个表和索引至少需要数据库文件中的一页。上句中的“索引”表示使用 CREATE INDEX 语句显式创建的索引或由 UNIQUE 和 PRIMARY KEY 约束创建的隐式索引。由于数据库文件中的最大页数为2147483646(略多于 20 亿),因此这也是模式中表和索引数量的上限。
每当打开数据库时,都会扫描和解析整个模式,并将模式的解析树保存在内存中。这意味着数据库连接启动时间和初始内存使用量与模式的大小成正比。
表的结构是否相同?如果是这样,通常认为将它们存储在具有标识列的单个表中是一种更好的做法。
我相信表的数量仅受数据库大小的限制。单个 SQLite 数据库中最多可以有 2,147,483,646 个页面。所以我猜这也将是单个 SQLite 数据库中的最大表数。
这是基于数据库页面仅用于表的假设,这可能不是一个非常有用的假设。
要回答您的问题 2 和 3,虽然拥有多个具有相似结构的表违反了数据库规范化的原则,但有很多实际原因表明它比单个表或虚拟表更受欢迎 - 当然,最大的原因是它比 SQLite删除表比删除列容易得多。如果您采用简单的方法并且不使用“正确”的规范化关系表,那么它占用的空间也比在单个表的每一行中具有“tableX”要少。
在性能方面,与“表”列中具有数十万个条目的单个表相比,使用数十万个表不会有任何问题,并且该列已编入索引。事实上,单个规范化表上的索引可能比 SQLite 使用的表索引机制大得多,而且效率较低。
说了这么多,我不能以健康的良心结束这篇文章,而不是说就像 exec() 被用来分配变量名称的变量是编程中常见的初学者错误,制作多个表应该在一个单一的规范化表中(虚拟或其他)是数据库架构中常见的初学者错误。在这两个领域中,在某些情况下,使用 exec 或许多表是正确的选择。例如,如果您的数据都非常相似,但您确定不会对数据进行任何连接,那么很多表都可以。只需确保您确实将数据视为完全不相关,尽管它们具有相似的结构。