在SQLite上只执行SELECT命令
本文关键字:SELECT 命令 执行 SQLite | 更新日期: 2023-09-27 17:49:45
我做了一个SQLite数据库(~700MB, 3个表,3个索引- 1个rtree索引和2个主键)。我已将其标记为只读文件(在Windows上)。
在这个数据库上从多个线程执行SELECT命令是安全和高效的吗?
如果是这样,如何使它更性能(任何选项或标志启用,任何微小的调整)?
这个应用程序是在c#中使用System.Data.SQLite(1.0.82.0),在x64机器上为。net 4.0编译。它工作得很好(不一定是性能或正确的并行,因为我不能/不知道(如何)证明它们)。目前我没有真正的瓶颈,但很快就会的!我需要尽快搜索r树。(在我的机器上,4GB, 2核)搜索树有时需要5毫秒以上的时间。我已经使该部分多线程并行处理我的数据。根据R-Tree的结构(或者我认为R*-Tree在SQLite的情况下),如果我的数据库增长到一些GB,它应该没有问题,因为这些树具有低深度和快速的大数据集。但是,如果有任何改进是可能的,那么应该在这个应用程序中考虑。
我不能确定已经并行的部分是否真的并行运行,例如SQLite(或System.Data.SQLite)没有内部锁。事实上,在一些测试中,并行版本运行得更慢!
如果每个线程都有自己的连接,或者您使用锁来防止多个线程同时使用同一个连接,那么这应该是安全的。
最有可能在这个数据库上从多个线程执行SELECT命令是安全和高效的吗?
你的瓶颈是什么?磁盘I/O ?处理器呢?记忆?如果可能的话,如何使它更高效?
提高应用程序的性能最好通过以下方式完成:1)识别性能较差(并且可以改进)的部分;2)提高这些部分的性能。有很多工具可以识别出代码中最慢的部分,这样你就知道首先要处理什么了。当程序获取查询结果并花费10秒将其写入磁盘时,从查询中节省10毫秒的时间是没有意义的。
没有"魔法棒"可以让你在一个应用程序(尤其是数据库驱动的应用程序)上挥一挥,让它运行得更快。您需要首先知道要修复的内容。可以设置线程支持级别:http://www.sqlite.org/threadsafe.html
SQLite支持三种不同的线程模式:
单线程。在这种模式下,所有互斥锁都被禁用,并且SQLite在多个线程中同时使用是不安全的。
多线程。在这种模式下,只要没有一个数据库连接在两个或多个线程中同时使用,SQLite就可以被多个线程安全地使用。
序列化。在序列化模式下,SQLite可以被多个线程安全地使用,没有任何限制。
线程模式可以在编译时(当SQLite库从源代码编译时)或在启动时(当打算使用SQLite的应用程序初始化时)或在运行时(当创建新的SQLite数据库连接时)选择。一般来说,运行时覆盖开始时间,而开始时间覆盖编译时间。除此之外,单线程模式一旦被选择就不能被覆盖。默认模式为序列化
您看到的减速是请求的序列化。改变线程模型,事情就会加快。请记住,"不安全"可能同时意味着读者和作者。我不确定什么是ONLY读者的最佳模式。