2010-06-17 80 views
6

我有一个充满电影信息的数据库,它从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

+0

+1好问题。你怎么知道影片已经存在于数据库中?请添加到您的帖子。 – DJTripleThreat 2010-06-17 02:28:14

+0

还有什么,你认为我应该添加到帖子? – 2010-06-17 02:33:04

+0

什么平台? Objective-C + sqlite让我觉得iPhone/iPad。 – Seth 2010-06-17 02:45:47

回答

0

你可以尝试在film_id添加索引,以加快对现有搜索膜。

像这样的东西应该做的工作:

CREATE INDEX IF NOT EXISTS film_index_film_id ON film (film_id) 

如果您独特的关键其实是别的东西(不仅仅是film_id,但也许标题和一年),那么你应该包括所有您在使用的列的指数。

0

如果film_id为每片独一无二的,你可以考虑这样的:

SELECT film_id FROM film; 

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

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

BEGIN TRANSACTION; 

和你插入后:

COMMIT; 
0

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