【问题标题】:Optimising Database Calls优化数据库调用
【发布时间】:2023-03-17 14:32:01
【问题描述】:

我有一个包含电影信息的数据库,该数据库(反过来)从网络服务器上的 XML 文件读入数据库。

会发生以下情况:

Gather/Parse XML and store film info as objects
Begin Statement
For every film object we found:
    Check to see if record for film exists in database
    If no film record, write data for film
Commit Statement

目前我只是使用(非常基本的)测试电影的存在:

SELECT film_title FROM film WHERE film_id = ?

如果返回一行,则该电影存在,如果不存在,则我需要添加它...

我也尝试过使用

INSERT INTO film (film_id, film_title, film_mStar, film_dStar, film_date) SELECT ?, ?, ?, ?, ?, ?, ? WHERE NOT EXISTS (SELECT 1 FROM film WHERE film_id = ?)

就处理时间而言,效果完全相同...

唯一的问题是,数据库中有数百条记录(很多电影!),因为它必须在写入之前检查数据库中是否存在电影,整个过程最终需要相当长的时间(210 部电影大约需要 27 秒)

有没有更有效的方法来做到这一点,或者只是一般的建议?

编程语言是Objective-C,数据库是sqlite3,平台是iPhone/iPad/iPodTouch

谢谢, 德维恩

【问题讨论】:

  • +1 好问题。你怎么知道这部电影已经存在于数据库中?请将其添加到您的帖子中。
  • 您认为我还有什么要补充的吗?
  • 什么平台? Objective-C + sqlite 让我想到 iPhone/iPad。
  • 假设重复项将触发引发约束,可能尝试插入记录并处理已存在的情况会更快。

标签: objective-c database sqlite performance


【解决方案1】:

您可以尝试在 film_id 上添加索引以加快搜索现有电影的速度。

这样的事情应该可以完成:

CREATE INDEX IF NOT EXISTS film_index_film_id ON film (film_id)

如果您的唯一键实际上是其他东西(不仅仅是电影 ID,还可能是标题和年份),那么您应该在索引中包含您使用的所有列。

【讨论】:

    【解决方案2】:

    如果每部电影的film_id 是唯一的,您可以考虑如下:

    SELECT film_id FROM film;
    

    在启动时,将所有 id 缓存在一个数组或类似中。然后,当您从 XML 读取新记录时,检查数组中是否存在 film_id,如果不存在,则将其添加到数组和数据库中。这样你每个文件只选择一次,而不是每部电影一次。

    编辑:要考虑的另一件事是交易。启动时:

    BEGIN TRANSACTION;
    

    在你所有的插入之后:

    COMMIT;
    

    【讨论】:

      【解决方案3】:

      为电影 ID 创建一个布尔数组(它可以只是一个位图) 然后将数组中每个对应地址的位设置为假/真。 然后,不要使用 sql 检查它是否存在,而是对照数组检查它。 插入时,将 filmid = true 添加到数组中。

      【讨论】:

        猜你喜欢
        • 2011-08-14
        • 2011-06-14
        • 2013-12-14
        • 1970-01-01
        • 2012-07-20
        • 2010-12-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多