2010-06-17 17 views
6

मेरे पास एक डेटाबेस है जो फिल्मों के लिए जानकारी से भरा हुआ है, जो (बदले में) किसी वेबसर्वर पर किसी 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 = ? 

हैं कि एक पंक्ति देता है, तो फिल्म

क्या होता है निम्नलिखित है मौजूद है, अगर नहीं तो मैं इसे जोड़ने की जरूरत है ...

मैं भी

उपयोग करने की कोशिश की है

प्रसंस्करण समय के संदर्भ में सटीक एक ही प्रभाव के लिए ...

केवल समस्या है, वहाँ डेटाबेस (फिल्मों के बहुत सारे!) में रिकॉर्ड के कई कई सैकड़ों हैं कि है और जांच करने के लिए है, क्योंकि यह है डेटाबेस में एक फिल्म के अस्तित्व के लिए इसे लिखने से पहले, पूरी प्रक्रिया में कुछ समय लग रहा है (210 फिल्मों के लिए लगभग 27 सेकंड)

क्या ऐसा करने का कोई और अधिक प्रभावी तरीका है, या बस कोई सुझाव सामान्य रूप में?

प्रोग्रामिंग भाषा ऑब्जेक्टिव-सी है, डेटाबेस sqlite3 में है, मंच iPhone/iPad/iPodTouch है

धन्यवाद, Dwaine

+0

+1 अच्छा सवाल। आप कैसे बताते हैं कि फिल्म डेटाबेस में पहले से मौजूद है?कृपया अपनी पोस्ट में जोड़ें। – DJTripleThreat

+0

क्या कोई और चीज है जो आपको लगता है कि मुझे पोस्ट में जोड़ना चाहिए? –

+0

क्या मंच? उद्देश्य-सी + एसक्लाइट मुझे आईफोन/आईपैड लगता है। – Seth

उत्तर

0

आप मौजूदा के लिए खोज में तेजी लाने के film_id पर एक सूचकांक से जोड़ने का प्रयास कर सकता है फिल्मों।

कुछ इस तरह काम करना चाहिए: अपने अद्वितीय कुंजी वास्तव में कुछ और (बस film_id नहीं शीर्षक और साल, लेकिन शायद) है

CREATE INDEX IF NOT EXISTS film_index_film_id ON film (film_id) 

तो आप सभी स्तंभों है कि आप में उपयोग को शामिल करना चाहिए अपने सूचकांक।

0

तो film_id प्रति फिल्म अद्वितीय है, आप की तरह कुछ विचार कर सकते हैं:

SELECT film_id FROM film; 
स्टार्टअप पर

, और एक सरणी या इसी तरह के सभी आईडी कैश। फिर जब आप अपने एक्सएमएल से एक नया रिकॉर्ड पढ़ते हैं, तो सरणी में film_id के अस्तित्व की जांच करें और यदि यह वहां नहीं है, तो इसे सरणी और डेटाबेस दोनों में जोड़ें। इस तरह आप फिल्म प्रति बार एक बार प्रति फ़ाइल एक बार चुनते हैं।

संपादित करें: विचार करने की एक और बात लेनदेन होगी। स्टार्टअप पर:

BEGIN TRANSACTION; 

और अपने सभी सम्मिलन के बाद:

COMMIT; 
0

filmIDs के लिए बूलियन्स की एक सरणी (यह सिर्फ एक बिट मानचित्र हो सकता है) तब के लिए/गलत पर बिट्स सेट सच बनाएं सरणी में प्रत्येक संबंधित पता। फिर यह जांचने के लिए एसक्यूएल का उपयोग करने के बजाय, यह सरणी के खिलाफ जांचें। सम्मिलन पर, सरणी में filmid = true जोड़ें।

संबंधित मुद्दे