Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在SQLite上仅执行SELECT命令_C#_Windows_Sqlite_Select_System.data.sqlite - Fatal编程技术网

C# 在SQLite上仅执行SELECT命令

C# 在SQLite上仅执行SELECT命令,c#,windows,sqlite,select,system.data.sqlite,C#,Windows,Sqlite,Select,System.data.sqlite,我制作了一个700MB的SQLite数据库,3个表,3个索引-1个rtree索引和2个主键。我已在Windows上将其标记为只读文件 从多个线程在该数据库上执行SELECT命令是否安全且性能良好 如果是这样的话,如何使任何选项或标志更有效,任何微小的调谐 此应用程序在C中使用System.Data.SQLite 1.0.82.0,在x64机器上为.NET 4.0编译。而且它工作得很好,不一定表现得很好,也不一定正确地平行,因为我不知道如何证明它们。目前我没有真正的瓶颈,但很快我会!我需要尽可能快

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

从多个线程在该数据库上执行SELECT命令是否安全且性能良好

如果是这样的话,如何使任何选项或标志更有效,任何微小的调谐

此应用程序在C中使用System.Data.SQLite 1.0.82.0,在x64机器上为.NET 4.0编译。而且它工作得很好,不一定表现得很好,也不一定正确地平行,因为我不知道如何证明它们。目前我没有真正的瓶颈,但很快我会!我需要尽可能快地搜索rtree。在我的4GB双核机器上,搜索rtree有时需要5毫秒以上。我已将该部分设置为多线程,以并行处理我的数据。根据SQLite中R*-树的结构,若我的数据库增长到GB,那个么应该不会有问题,因为这些树的深度很低,在大型数据集上运行速度很快。但是,如果有任何改进是可能的,那么在这个应用程序中应该加以考虑


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

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

您可以设置线程支持级别:

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

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

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

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

当从源代码编译SQLite库时,或者当打算使用SQLite的应用程序正在初始化时,或者在运行时创建新的SQLite数据库连接时,可以在编译时选择线程模式。一般来说,运行时覆盖开始时,开始时覆盖编译时。除此之外,一旦选择单线程模式,则无法重写

默认模式是序列化的

您看到的放缓是请求的序列化。改变线程模型,事情就会加快。请记住,不安全可能意味着读者和作者同时存在。我不知道什么是最好的模式,只有读者

从多个线程在该数据库上执行SELECT命令是否安全且性能良好

很可能

如果可能的话,如何提高性能

你的瓶颈是什么?磁盘I/O?加工机记忆

使应用程序性能更高的最佳方法是1识别性能较差且可以改进的部分,2使这些部分性能更高。有很多工具可以识别代码中最慢的部分,这样您就知道首先要处理什么了。当程序获取查询结果并花费10秒将其写入磁盘时,将查询时间缩短10毫秒是没有意义的


没有一根魔杖可以让你在一个应用程序,尤其是数据库驱动的应用程序上挥舞,让它运行得更快。你需要知道先修复什么

提供的。。注意这一点非常重要。我已经添加了一些描述。他信只使用了多线程,因为我从它的描述中认为这是我应该选择的。我也测试过其他选择。问题是,我不确定如果使用单线程选项进行连接,它是否能在多线程应用程序中正常工作。如何测试它是否返回正确答案?将我的数据库移植到另一个数据库并使用该另一个数据库测试结果;因为我的测试实际上使用的是SQLite本身,所以您可以始终使用线程安全的序列化模式进行测试,有时在这种情况下,我会尝试在SQLite源代码中找到一个单元测试来进行检查。确保删除应用程序正在执行的任何其他操作。sqlite源代码是开放的,因此您可以加入另一个单元测试来验证您的结果