SQLite 和 DISQLite 如何比较大型简单数据库?
Posted
技术标签:
【中文标题】SQLite 和 DISQLite 如何比较大型简单数据库?【英文标题】:How Do SQLite and DISQLite Compare for a Large Simple Database? 【发布时间】:2010-01-11 06:24:39 【问题描述】:SQLite 和 DISQLite 之间有什么区别,我为什么要选择其中一个?
我的上下文是我正在处理一个大型数据库(可能高达 10 GB),其中的关键部分是在一个非常简单的表中,该表具有单个索引字段和一个最大大小为几 KB 的文本字段.我的开发工具是Delphi 2009,数据库会嵌入到我的.exe中。
我的主要标准是速度。这适用于在典型 Windows 计算机上运行的软件应用程序,例如 Windows 7 和 4 GB RAM。
如果您想推荐另一个数据库工具,请告诉我为什么它比这两个更适合我的应用程序,尤其是在速度前沿。
【问题讨论】:
您的意思是数据库引擎(不是数据库文件本身)将嵌入到可执行文件中,对吧? 是的。数据库仍然是基于磁盘的。 【参考方案1】:AFAIR,DISQLite 使用 Sqlite 的 obj 文件,用 Delphi 编译,产生比原来更多的功能,并且使用相同的 sqlite DB 格式,因此您可以通过其他语言读取 DISQLite 数据库文件支持 Sqlite 驱动程序。
DISQLite 还有一项功能,您不必分发 Sqlite DLL。
DISQLite 支持高达 2TB 的数据库大小,因此它可以毫无问题地处理您的需求。
我会考虑的另一个选项是 FireBird 嵌入式版本,如果您想扩展它,您可以毫不费力地更改为完整的 FireBird 服务器。
但我认为 Sqlite 和 DISQLite 都会比 Firebird 表现得更好。
我使用Audcom Sqlite components访问Sqlite数据库,你可以用Sqlite objs文件编译它,这样你就不用部署sqlite dll了。
【讨论】:
感谢他们认为他们的表现优于 Firebird。但正如 Kavitesh 所说,SQLite 可以使用源代码编译到我的应用程序中,并且不需要 DLL。 来自 SQLite:sqlite.org/download.html sqlite-amalgamation 将所有预处理的 C 代码组合到一个源文件中,可以在您的应用程序中使用并一起编译。由于我没有研究过delphi,所以我不会评论它是否可以直接编译C代码或需要DLL来访问所有API。 他的意思是原始sqlite库的源代码,它是用C编写的,如果您阅读了我回答中的最后一段,您也可以使用Audcom Sqlite组件来做到这一点,所以您不必将 Sqlite Dll 与您的应用程序一起分发。【参考方案2】:我可以建议您编写自己的实现。如果您不需要复杂的 SQL 查询,最简单(可能也是最快)的实现是基于文件的存储。
【讨论】:
我已经考虑了一段时间。见:***.com/questions/1799634/… 我同意,实际上顺序读/写的性能最快……但随机读的访问很糟糕。如果您需要对大型数据集进行索引访问,请使用引擎……如果集合相对较小,或者仅按写入顺序读取,则使用基于文件/流的解决方案。【参考方案3】:DISQLLite 有两个版本,免费版本仅限于个人和非商业用途。所以这可能是决定因素之一,因为 SQLite 是免费的开源实现,没有免费/付费版本。
这两个数据库都能够处理以 GB 为单位的数据。 SQLite 以预编译的二进制文件形式提供,即 DLL,它可以随您的应用程序分发。但是,有了可用的源代码,您也可以在您的应用程序中编译它并使用它,而无需 DLL。
使用 DLL 模块的优势(有时)是当一些错误得到解决时,您只需在客户端机器上替换 DLL,而不是重新编译整个应用程序。
我觉得 SQLite 会是满足您要求的更好选择。数据库的速度并不完全取决于数据库的类型。硬盘访问速度、可用处理能力、RAM 等硬件在加快数据库速度方面也发挥着重要作用。
【讨论】:
但是为什么你认为 SQLite 对我来说会更好?我知道速度取决于外部因素,但对于运行 Vista 或具有 4GB RAM 的 Windows 7 的标准 Windows 机器,这对我来说会更好(我也会将此添加到我的问题中)。 SQLite 是开源的,没有任何限制。如果您查看 DISqlite yunqa.de/delphi/doku.php/products/sqlite3/… 的比较表,您会看到大部分功能在付费版本中可用。另外,由于您没有查看企业级数据库,因此我觉得性能差异可以忽略不计。现在 DISQLite 也提供免费版本,他们可能会在以后停止或以某个价格提供它。这可能是一个问题。此外,SQLite 正在进行活跃的社区开发,使更新变得容易获得。【参考方案4】:请注意,DISQLLite 个人版有一些限制,当任何人都可以免费实现 SQLite 包装器时,我认为专业版(没有源代码的 149.99 欧元)的价格是不值得的。
我将 DISQLite 个人用于免费软件产品,并且必须在新版本中实施数据库更改。个人版不支持“ALTER”,所以我不得不购买完整版。所以我放弃了 DISQLite,只使用了一个好的 SQLite 包装器。如果您准备为完整版付费,请仅选择 DISQLite。
SQLite4Delphi 可能是更好的选择,或者至少可以为您提供更具成本效益的解决方案。
【讨论】:
【参考方案5】:看看我们的SynBigTable unit。它将是 much faster than SQLite,并且似乎完全符合您的目的。
如果您需要本机 SQLite 实现,请查看我们的 SQLite3 framework:它是免费且开源的,没有任何外部 dll。并且比封闭的 DiSQLite 具有更多的功能(例如用于实现 SQL 函数或虚拟表的 Delphi 本机类)。
对于性能 POV,瓶颈不是您使用的包装器,而是磁盘访问以及您设置数据库的方式。不要忘记使用indexes 尽快检索您的数据。那么对于 SQLite 来说,即使是 10 GB 的数据也不会成为问题,无论您使用什么包装器。
【讨论】:
感谢您发布此信息。虽然它不是我问题的答案,但我对 SynBigTable 的阅读印象非常深刻,它可能只是我一直在寻找的程序所需的模块。请参阅我的问题:***.com/questions/1799634/… 我为此选择了 GpStructuredStorage,但是(没有先测试)似乎 SynBitTable 对我来说可能更好。 @lkessler 我刚刚引用了 SynBigTable,因为在软件中从来没有一个封闭的问题。有时,最好改变它的初衷(例如改变架构的存储引擎)。千万不要关上所有的门。 ;) @lkessler 你问了关于 Delphi 上的 SQlite,而且不仅有 DiSQLite - 还有几个包装器,而且从我自己的(拖钓)POV 来看,我不喜欢你应该必须为使用开源库付费。这就是我尽我所能发布一个免费、快速、轻便且对 Delphi 友好的 OpenSource SQLite3 包装器的原因。我的单元具有高级 Delphi 面向类的 SQLite3 特性包装器,而不是 DiSQLite3 不支持的特性,如自定义 SQL 函数或虚拟表。虚拟表只是 SQLite3 的瑰宝。 ;) 我们刚刚使我们的 SQLite3 包装器独立于我们的 ORM,在一个新的专用单元中。您可以访问任何 OleDB 提供程序(包括最新版本的 MSSQL)、通过直接访问 OCI 层的 Oracle 以及现在静态嵌入到可执行文件中的 SQLite3。您可以从一个数据库更改到另一个数据库,代码开销很小。见blog.synopse.info/post/2011/07/22/…以上是关于SQLite 和 DISQLite 如何比较大型简单数据库?的主要内容,如果未能解决你的问题,请参考以下文章
将大型 python 列表传递到 SQLite SELECT 语句时如何提高性能?