我创建了一个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毫秒以上。我已将多线程部分用于并行处理我的数据。根据{{3}}的结构(或者我认为在SQLite的情况下我认为是R * -Tree),如果我的数据库增长到某个GB,它应该没有问题,因为这些树的深度较低,并且在大型数据集上很快。但如果可以进行任何改进,则应在本申请中予以考虑。
我无法确定并行的部分是否真正并行运行,例如SQLite(或System.Data.SQLite)没有内部锁定。事实上,在某些测试中,并行版本运行得更慢!
答案 0 :(得分:4)
这应该是安全的,前提是每个线程都有自己的连接,或者你使用锁来防止多个线程同时使用同一个连接。
答案 1 :(得分:3)
从多个线程执行此数据库上的SELECT命令是否安全且高效?
最有可能
如何才能提高性能(如果可能的话)?
你的瓶颈是什么?磁盘I / O?处理器?记忆?
使应用程序更高性能最好通过1)识别表现不佳(并且可以改进)的部分和2)使这些部分更高性能。有很多工具可以识别代码中最慢的部分,这样您就可以先了解要解决的问题。当程序获取该查询的结果并花10秒钟将其写入磁盘时,从查询中删除10ms是没有意义的。
你可以在应用程序(特别是数据库驱动的应用程序)上挥动“魔术棒”并使其运行得更快。您需要首先了解要修复的内容。
答案 2 :(得分:1)
您可以设置线程支持级别:http://www.sqlite.org/threadsafe.html
SQLite支持三种不同的线程模式:
<强>单螺纹即可。在此模式下,所有互斥锁都被禁用,并且SQLite一次不能在多个线程中使用。
<强>多线程即可。在这种模式下,多个线程可以安全地使用SQLite,前提是在两个或多个线程中不同时使用单个数据库连接。
<强>序列化即可。在序列化模式下,SQLite可以被多个线程安全地使用而没有任何限制。
可以在编译时(在从源代码编译SQLite库时)或在启动时(当打算使用SQLite的应用程序正在初始化时)或在运行时(在运行时)选择线程模式正在创建新的SQLite数据库连接)。一般来说,运行时覆盖启动时和启动时覆盖编译时。除此之外,单线程模式一旦被选中就无法覆盖。
默认模式已序列化。
您看到的减速是请求的序列化。更改线程模型,事情会加快。请记住,“不安全”可能同时意味着读者和作者。我不确定ONLY读者的最佳模式是什么。