我有一个数据库,里面装满了电影的信息,这些信息(依次)从with服务器上的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
谢谢,Dwaine
发布于 2010-06-17 11:49:58
您可以尝试在film_id上添加索引,以加快搜索现有电影的速度。
这样的代码应该可以完成这项工作:
CREATE INDEX IF NOT EXISTS film_index_film_id ON film (film_id)如果您的惟一键实际上是其他键(不仅仅是film_id,还可能是title和year),那么您应该包括索引中使用的所有列。
发布于 2010-06-17 12:05:03
如果每部电影的film_id都是独一无二的,你可以考虑如下内容:
SELECT film_id FROM film;在启动时,缓存数组或类似数组中的所有ids。然后,当从XML中读取新记录时,检查数组中是否存在film_id,如果不存在,则将其同时添加到数组和数据库中。这样,每个文件只选择一次,而不是每个胶片选择一次。
编辑:另一件需要考虑的事情是事务。启动时:
BEGIN TRANSACTION;在您的所有插入之后:
COMMIT;发布于 2010-06-17 12:50:07
为电影in创建一个布尔值数组(它可以只是一个位图),然后将数组中每个相应地址的位设置为false/true。然后,不使用sql检查它是否存在,而是根据数组检查它。插入时,将filmid = true添加到数组中。
https://stackoverflow.com/questions/3058511
复制相似问题