2010-06-17 56 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添加到數組中。