4

我制作了一个 SQLite 数据库(约 700MB,3 个表,3 个索引 - 1 个 rtree 索引和 2 个主键)。我已将其标记为只读文件(在 Windows 上)。

从多个线程仅在此数据库上执行 SELECT 命令是否安全且高效?

如果是这样,如何使其性能更高(启用任何选项或标志,任何微小的调整)?

此应用程序使用 C# 编写,使用 System.Data.SQLite (1.0.82.0),在 x64 机器上为 .NET 4.0 编译。它工作正常(不一定是高性能或正确并行,因为我不能/不知道(如何)证明它们)。目前我没有真正的瓶颈,但很快我会的!我需要尽快搜索 rtree。(在我的机器 4GB,2 核上)搜索 rtree 有时需要超过 5 毫秒。我已将该部分设为多线程以并行处理我的数据。并且根据R-Tree的结构(或者我认为在 SQLite 的情况下是 R*-Tree),如果我的数据库增长到一些 GB,那应该没问题,因为这些树的深度较低并且在大型数据集上速度很快。但如果有任何改进是可能的,那么应该在这个应用程序中考虑。

我无法确定已并行化的部分是否真的并行运行,例如 SQLite(或 System.Data.SQLite)没有内部锁。事实上,在某些测试中,并行版本运行速度较慢!

4

3 回答 3

4

这应该是安全的,前提是每个线程都有自己的连接,或者您使用锁来防止多个线程同时使用同一个连接。

于 2012-12-27T19:56:41.993 回答
3

从多个线程仅在此数据库上执行 SELECT 命令是否安全且高效?

最有可能的

怎样才能提高性能(如果可能的话)?

你的瓶颈是什么?磁盘 I/O?处理器?记忆?

提高应用程序的性能最好通过 1) 识别性能不佳的部分(并且可以改进)和 2) 提高这些部分的性能。有许多工具可以识别代码中最慢的部分,因此您知道首先要解决什么问题。当程序获取查询结果并花费 10 秒将其写入磁盘时,将查询缩短 10 毫秒是没有意义的。

没有“魔杖”可以让您在应用程序(尤其是数据库驱动的应用程序)上挥动并使其运行得更快。你需要知道首先要解决什么问题

于 2012-12-27T20:00:22.517 回答
1

您可以设置线程支持级别: http ://www.sqlite.org/threadsafe.html

SQLite 支持三种不同的线程模式:

单线程。在这种模式下,所有互斥锁都被禁用,SQLite 一次在多个线程中使用是不安全的。

多线程。在这种模式下,SQLite 可以被多个线程安全地使用,前提是没有在两个或多个线程中同时使用单个数据库连接。

序列化. 在序列化模式下,SQLite 可以不受限制地被多个线程安全使用。

可以在编译时(从源代码编译 SQLite 库时)或在启动时(当打算使用 SQLite 的应用程序正在初始化时)或在运行时(当新的 SQLite 数据库时)选择线程模式正在创建连接)。一般来说,运行时会覆盖开始时间,而开始时间会覆盖编译时。除了,单线程模式一旦选择就不能被覆盖。

默认模式是序列化的。

您看到的减速是请求的序列化。更改线程模型,事情会加快。请记住,“不安全”可能同时意味着读者和作者。我不确定只有读者的最佳模式是什么。

于 2012-12-27T19:59:12.550 回答