2012-12-27 16 views
4

我做了一个SQLite数据库(〜700MB,3个表,3个索引 - 1个索引和2个主键)。我将它标记为只读文件(在Windows上)。在SQLite上执行SELECT命令

从多线程执行这个数据库的SELECT命令是否安全和高性能?

如果是这样,怎样才能提高性能(任何选项或标志启用,任何微调)?

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

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

回答

4

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

+0

“* .. provided .. *”对于您来说非常重要。 – 2012-12-27 20:05:51

1

您可以设置线程支撑位:http://www.sqlite.org/threadsafe.html

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

单线程。在这种模式下,所有的互斥锁都被禁用,并且SQLite不安全,可以同时在多个线程中使用。

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

序列号。在序列化模式下,SQLite可以安全地由多个线程使用,没有任何限制。

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

默认模式是序列化的。

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

+0

我只使用多线程,因为我认为(从它的描述),这是我应该选择。我也测试了其他选项。问题是我不确定是否使用单线程选项进行连接,它可以在多线程应用程序中正常工作。我如何测试它是否返回正确答案? (另一个将我的数据库移植到另一个数据库并使用另一个数据库测试结果;)因为我的测试实际上使用了SQLite本身)。 –

+0

你总是可以对线程安全的序列化模式进行测试 – devshorts

+0

有时在这些情况下,我尝试在sqlite源代码中找到一个单元测试来检查。确保消除你的应用正在做的任何事情。 sqlite源代码是开放的,所以你可以通过另一个单元测试来验证你的结果 – devshorts

3

从多个线程执行这个数据库的SELECT命令是否安全和高性能?

最有可能

怎么能做出更好的性能(如果可能的话)?

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

使应用程序更高性能最好通过以下方法来完成:1)识别表现不佳(可以改进)的部分; 2)使这些部分更高效。有很多工具可以识别代码中最慢的部分,所以你首先知道该怎么处理。当程序获得该查询的结果并花费10秒钟将其写入磁盘时,从查询中删除10ms是没有意义的。

您可以在应用程序(尤其是数据库驱动的应用程序)上运行并使其运行速度更快,而不是“魔术棒”。您需要知道首先要修复

+0

我已经添加了一些更多的描述。 Thaks –