优化数据库调用
问题描述:
我有一个充满电影信息的数据库,它从Web服务器上的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 = ?
如果返回一行,则膜存在,如果没有的话,我需要补充它...
我也使用
尝试3210要处理时间方面完全一样的效果......
唯一的问题是,是,有数据库(很多电影!)许多数以百计的记录,因为它必须检查对于在数据库中存在电影之前它可以写它,整个过程结束需要相当长的一段时间(210电影约27秒)
是否有一个更有效的方法做到这一点,或只是任何建议一般来说?
编程语言是Objective-C中,数据库是sqlite3的,平台是iPhone/iPad的/ iPod Touch的
感谢, DWAINE
答
你可以尝试在film_id添加索引,以加快对现有搜索膜。
像这样的东西应该做的工作:
CREATE INDEX IF NOT EXISTS film_index_film_id ON film (film_id)
如果您独特的关键其实是别的东西(不仅仅是film_id,但也许标题和一年),那么你应该包括所有您在使用的列的指数。
答
如果film_id为每片独一无二的,你可以考虑这样的:
SELECT film_id FROM film;
在启动和高速缓存阵列中的或类似的所有ID。然后,当您从XML读取新记录时,检查数组中是否存在film_id,如果不存在,请将其添加到数组和数据库中。这样你每个文件只选择一次,而不是每个电影一次。
编辑:另一件要考虑的事情是交易。在启动时:
BEGIN TRANSACTION;
和你插入后:
COMMIT;
答
创建布尔为filmIDs数组(它可以只是一个位图) 然后设置位为false /真为数组中的每个对应地址。 然后,而不是使用sql来检查它是否存在,检查它对阵列。 插入时,将filmid = true添加到数组中。
+1好问题。你怎么知道影片已经存在于数据库中?请添加到您的帖子。 – DJTripleThreat 2010-06-17 02:28:14
还有什么,你认为我应该添加到帖子? – 2010-06-17 02:33:04
什么平台? Objective-C + sqlite让我觉得iPhone/iPad。 – Seth 2010-06-17 02:45:47