SQLite 数据库文件支持的最大表数
Posted
技术标签:
【中文标题】SQLite 数据库文件支持的最大表数【英文标题】:Maximum of tables a SQLite database file supports 【发布时间】:2012-07-13 17:22:22 【问题描述】:即使在阅读SQLite limits 之后,我也找不到 SQLite 数据库文件可以容纳的最大表数。所以,我想知道是否
-
SQLite 数据库可以容纳的表的最大数量是多少?
在 SQLite 数据库文件中包含数千个小表是个问题吗?
SQLite 数据库文件中的许多表会影响查询性能?
【问题讨论】:
【参考方案1】:SQLite 中的限制列表记录在 at this page。没有给定每个数据库的最大表数,因此 SQLite 可能没有实现限制。每个 JOIN 限制为 64 个表。
4。一个连接中的最大表数
SQLite 不支持包含超过 64 个表的连接。这 限制源于 SQLite 代码生成器使用位图这一事实 在查询优化器中每个连接表一位。
SQLite 使用高效的查询规划器算法,因此即使是大型 加入可以很快准备。因此,没有任何机制可以提高或 降低连接中表的数量限制。
15.架构中的最大表数
每个表和索引至少需要数据库文件中的一页。 上句中的“索引”表示显式创建的索引 使用 CREATE INDEX 语句或由 UNIQUE 创建的隐式索引 和 PRIMARY KEY 约束。由于一个页面的最大页数 数据库文件是 2147483646(略超过 20 亿)这也是 然后是架构中表和索引数量的上限。
每当打开数据库时,都会扫描和解析整个架构 并且模式的解析树保存在内存中。这意味着 数据库连接启动时间和初始内存使用量是 与架构的大小成正比。
表的结构是否相同?如果是这样,通常认为将它们存储在具有标识列的单个表中是一种更好的做法。
【讨论】:
我同意你的看法,但我有一个问题。假设我有一张表和 20 条带有标识列的不同记录。每个标识列有 20K 行,如果我必须从 20 行中删除 7 行。我需要多少处理,考虑电池使用情况以及如果我有 20 个不同的相同表并且我只是删除表怎么办。请让我知道哪种方法更好? 单表方法是最好的,即使您必须考虑处理删除问题。您确实不希望不必担心在数据库中维护多个相同的表。也就是说,即使有有效的删除,从表中删除数千行所涉及的工作也比删除单个表要多。 Larry 我知道单表方法是最好的,但你所说的“帽子说,即使有效删除,从表中删除数千行比删除单表”我对您在这里支持多表感到困惑。请澄清。感谢您的时间:-)【参考方案2】:我相信表的数量仅受数据库大小的限制。单个 SQLite 数据库中最多可以有 2,147,483,646 个页面。所以我猜这也将是单个 SQLite 数据库中的最大表数。
这是基于数据库页面仅用于表的假设,这可能不是一个非常有用的假设。
【讨论】:
【参考方案3】:要回答您的问题 2 和 3,虽然拥有多个具有相似结构的表违反了数据库规范化的原则,但有许多实际原因表明它比单个表或虚拟表更受欢迎 - 当然最大的原因是在 SQLite 中,删除表比删除列容易得多。如果您采用简单的方法并且不使用“正确”的规范化关系表,那么它占用的空间也比在单个表的每一行中包含“tableX”要少。
就性能而言,与在“表”列中包含数十万个条目且该列已编入索引的单个表相比,使用数十万个表不会有任何问题。事实上,单个规范化表上的索引可能比 SQLite 使用的表索引机制大得多,而且效率较低。
说了这么多,我不能以健康的良心结束这篇文章,而不是说就像 exec() 被用来分配变量名的变量是编程中一个常见的初学者错误,制作多个表应该在一个单个规范化表(虚拟或其他)是数据库架构中常见的初学者错误。在这两个领域中,在某些情况下,使用 exec 或许多表是正确的选择。例如,如果您的数据都非常相似,但您确定不会对数据进行任何连接,那么很多表都可以。只需确保您确实认为数据是完全不相关的,尽管它们具有相似的结构。
【讨论】:
以上是关于SQLite 数据库文件支持的最大表数的主要内容,如果未能解决你的问题,请参考以下文章
Delphi中SQLite如何读写二进制字段(Blob类型)