0

我有一个相当大(3,000,000 行)的 SQLite 数据库。它由一张桌子组成。该表有一个整数 id 列、一个基于文本的标记列、一个保存为 int 的时间戳列和 15 个双精度列。我在标签和时间戳列上有一个唯一索引,因为我总是使用两者来查找条目。

我需要运行数据库并进行大量计算。主要是调用一堆select语句。选择语句的复杂性非常简单。我正在使用 GRDB 库。

这是一个示例查询。

do {
    try dbQueue.read { db in
        let request = try DataObject
            .filter(Columns.tag == tag)
            .filter(Columns.dateNoDash = date)
            .fetchOne(db)
    }
} catch { Log.msg("Was unable to query database. Error: \(error)") }

当我对我的程序生成的查询(使用explain query plan)运行调试跟踪时,我可以看到正在使用索引。

我必须遍历很多查询,所以我对一部分查询进行了基准测试。我发现 600 个查询大约需要 28 秒。我在 10 核 iMac Pro 上运行该程序。这似乎很慢。我一直认为 SQLite 更快。

循环中的其他代码基本上将某些数字相加并可能创建一个平均值,因此没有什么复杂且计算量大的问题。

我试图通过将以下配置添加到数据库连接来加快速度。

var config = Configuration()
config.prepareDatabase { db in
    try db.execute(sql: "PRAGMA journal_mode = MEMORY")
    try db.execute(sql: "PRAGMA synchronous = OFF")
    try db.execute(sql: "PRAGMA locking_mode = EXCLUSIVE")
    try db.execute(sql: "PRAGMA temp_store = MEMORY")
    try db.execute(sql: "PRAGMA cache_size = 2048000")
}
let dbQueue = try DatabaseQueue(path: path, configuration: config)

我能做些什么来加快速度吗?GRDB 是否会减慢速度?我做错什么了吗?我应该使用不同的数据库,如 mySQL 之类的吗?

感谢您的任何提示/输入

4

0 回答 0