【问题标题】:Performing just SELECT commands on SQLite在 SQLite 上只执行 SELECT 命令
【发布时间】:2012-12-13 04:24:27
【问题描述】:

我创建了一个 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)没有内部锁。事实上,在某些测试中,并行版本的运行速度较慢!

【问题讨论】:

    标签: c# windows sqlite select system.data.sqlite


    【解决方案1】:

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

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

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

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

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

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

    默认模式为序列化。

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

    【讨论】:

    • 我只使用了多线程,因为我认为(根据它的描述)这是我应该选择的。我也测试了其他选项。问题是我不确定是否例如使用单线程选项建立连接,它是否可以在多线程应用程序中正常工作。如何测试它是否返回正确答案? (其他是将我的数据库移植到另一个数据库并使用另一个数据库测试结果;)因为我的测试实际上使用 SQLite 本身)。
    • 你总是可以测试线程安全的序列化模式
    • 有时在这些情况下,我会尝试在 sqlite 源代码中找到一个单元测试来检查。确保消除您的应用程序正在执行的任何其他操作。 sqlite 源是开放的,因此您可以添加另一个单元测试来验证您的结果
    【解决方案2】:

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

    很有可能

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

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

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

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

    【讨论】:

    • 我添加了更多描述。谢谢
    【解决方案3】:

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

    【讨论】:

    • ..provided..”非常重要。
    猜你喜欢
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多