SQLite数据库的实际最大实际大小是多少?


33

根据有关SQLite适当用法的这篇文章,它说,尽管SQLite的限制为140 TB,但客户端/服务器RDBMS可能会更好地工作:

SQLite数据库的大小限制为140 TB(2 47字节,128 TB)。即使可以处理更大的数据库,SQLite也会将整个数据库存储在单个磁盘文件中,而许多文件系统将文件的最大大小限制为小于此大小。因此,如果您正在考虑这种规模的数据库,那么最好考虑使用一个客户机/服务器数据库引擎,该引擎将其内容分布在多个磁盘文件中,甚至可能分布在多个卷中。

总的来说,我同意这一点,但是得知SQLite的最大限制如此之高,我感到很惊讶!根据我的经验,我已经使用了许多SQL Server数据库,其大小约为30-100GB。我还间接使用Oracle,Postgres或Cassandra处理更大的数据库。其中,至少就我所知,没有一个接近140TB。我不是DBA,因此根据我的直接经验,我认为这是“大笔”的事情。

对于数据库很小的情况,我只考虑过SQLite。最多几十兆。

阅读本文后,我仍然不相信要考虑将SQLite用于可能需要数百GB数据的任何事情。但是我想知道我是否一直在低估它的功能。在实际使用中,SQLite数据库的实际最大大小限制是多少?


3
我只是认为我们通常必须考虑并发连接的数量,因为通常假定大型数据集将由多个用户使用。有没有一种方法可以在您自己的系统上进行测试?
JeffO

3
对于几乎不需要访问的诸如已归档事务的数据库之类的东西,SQLite可能是一个不错的选择,并且一次只能有一个用户(如果有的话),而您不必拥有一个完整的用户。支持它的数据库服务器设置。另一方面,如果您有多个并发用户,则很可能会遇到锁定锁定的问题,而这甚至早于获得数千兆位数据库的时间。
迈克尔·科恩


2
@Pacerier-是的,安装软件。然后,您必须分配数据库角色,弄清楚如何集成到备份系统中,确保备份系统在备份的开始和结束时将数据库服务器置于正确的状态,等等,等等。设置数据库服务器,而不只是安装软件。此外,从网络安全的角度来看,这是您还需要担心的另一项服务,而跟上补丁程序的工作又是另一件事。如果您需要数据库服务,请务必使用它,但是您不需要它,SQLite的开销要少得多。
迈克尔·科恩

1
@ leeand00-或者您可以租用一个月的空间。
JeffO '18年

Answers:


26

实际限制(某些Sqlite数据库的大小)与数据文件的实际限制相同。这个限制取决于您的计算机和系统。在当前的Linux桌面上,我无法承受比350Gbyte大得多的文件(因为根据经验,我避免让一个文件占用超过一半磁盘分区的空间)。顺便说一句,该实际限制还影响到其他SQL RDBMS,例如PostGreSQL或MariaDB(但其中大多数将数据保存在多个文件中,您可以将其保留在不同的文件系统上,并且其中一些能够管理远程计算机上的分布式数据。 )

阅读本文后,我仍然不相信要考虑将SQLite用于可能需要数百GB数据的任何事情

你是对是错。

您是对的,因为在当今的计算机(笔记本电脑和台式机,而不是超级计算机或数据中心服务器)上,一百GB的磁盘空间仍然很大。因此,在实践中,如果考虑到这么大的数据库,则最好想象一台真正的SQL服务器(例如PostGreSQL),因为您可能需要非常远程的访问,有效的并发访问以及分布式的数据和表。

您错了(原则上,我从没有尝试过),因为假设您有一个文件系统能够处理这么大的文件(可能是两个),SQLite很可能能够(有时经过测试)处理数百GB的数据库。他们至少)。

我当然会(有时)考虑将SQLite用于数十个千兆字节的数据库(并且我确实曾经尝试过这么大的.sqlite文件,即40GB的IIRC)。在当前的(非超级计算机)计算机上,我会犹豫是否拥有数百GB的SQLite数据库,仅仅是因为按照今天的实践,这样的文件很大。

IIRC一些出售专用文件系统机器的硬件供应商曾经说过一个TB级的sqlite应用程序(但我可能错了)。

当然,SQLite的性能取决于(像所有的SQL数据库)很多表,它们的索引,涉及的SQL查询的数量和宽度。而且,您不希望同时访问(通过许多不同的进程),而应该使用事务处理(根据经验,即使在只有几兆字节的小型SQLITE数据库上,您也确实想用BEGIN TRANSACTION&来包装例如数千个插入请求)END TRANSACTION,不这样做会使Sqlite的运行速度大大降低-超过10倍-)。

根据个人经验,通过适当的配置和组织,SQLite能够管理大于可用RAM的数据库(因此30G字节不是问题)-但您可能希望索引适合RAM!

如果您碰巧为“超级计算机”或昂贵的工作站(例如512GB的RAM,8TB的磁盘和512GB的SSD)编写代码,那么您肯定可以拥有TB级的Sqlite数据库。但是,仅当一个(或很少)进程正在访问该数据库时,您才想这样做。如果您有十几个进程同时访问同一数据库,则最好安装真正的SQL RDBMS(例如MariaDB或PostGreSQL)

还要注意,虽然.sqlite数据库文件的(二进制)格式被记录为“可移植”,但我还是更喜欢以SQL 文本格式(使用sqlite3 mydb.sqlite .dump > mydb.sql)备份数据库。然后,我还需要一些额外的磁盘空间用于该文本转储(这降低了实际限制)。

通常,Sqlite并不是瓶颈。但是磁盘可能是。

PS。可以使用GDBM将相同的推理应用于大型索引文件。

PPS。在我的MELT监视器(GPLv3免费软件,在github上)的expjs分支(2016年9月)中,我将整个应用程序堆持久保存在一个新的Sqlite数据库中的JSON中。我已经对数百万个对象(相当大的对象)进行了微小的实验,没有令人惊讶的地方。YMMV。


7
您可能在第四段之后停止了写作。但是无论如何+1。
罗伯特·哈维

3
也许吧,但令我感到非常惊讶的是,即使在只有几兆字节的新的sqlite数据库上,事务在实践中也是如此重要(只有一个进程访问,实际写入该新文件)。
Basile Starynkevitch

3
写肯定是正确的。在实践中,很难想象像OP描述的那样大小的SQLite数据库。Postgresql可能是一个更好的选择,不是因为它具有大小功能,而是SQLite没有的工业强度并发性。
罗伯特·哈维

5
在很多情况下,您可能会拥有文件大小很大的SQLite数据库。来自SQLite开发人员本身:少将其视为MySql的替代品,而应将其视为fopen的替代品。编写一些3D cad软件并使用SQLite数据库存储有关对象的数据可能是完全合理的。
whatsisname 2016年

2
@Pacerier:电影文件和类似的二进制Blob通常不存储在数据库中。它们存储在文件系统中,并且指向它们的链接存储在数据库中。
罗伯特·哈维
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.