2012-12-27 14 views
7

मैं एक मेज उपयोग इस तरह के स्कीमा बनाने के लिए:बयान प्रदर्शन की तरह SQLite सुधार करने के लिए कैसे

CREATE TABLE wordIndex(id integer primary key, word varchar(128), offset integer, length integer); 
CREATE INDEX word_idx on wordIndex(word); 

अब तालिका 450,000 के बारे में पंक्ति records.When मैं बयान ipod4 पर नीचे की तरह उपयोग किया है, प्रदर्शन नहीं अच्छा है: WordIndex से * चुनें जहां 'test acces%' जैसे शब्द; उपयोग समझाने उत्पादन:

explain select * from wordIndex where word like 'test acces%'; 
0|Trace|0|0|0||00| 
1|Goto|0|16|0||00| 
2|OpenRead|0|2|0|4|00| 
3|Rewind|0|14|0||00| 
4|String8|0|2|0|test acces%|00| 
5|Column|0|1|3||00| 
6|Function|1|2|1|like(2)|02| 
7|IfNot|1|13|1||00| 
8|Rowid|0|4|0||00| 
9|Column|0|1|5||00| 
10|Column|0|2|6||00| 
11|Column|0|3|7||00| 
12|ResultRow|4|4|0||00| 
13|Next|0|4|0||01| 
14|Close|0|0|0||00| 
15|Halt|0|0|0||00| 
16|Transaction|0|0|0||00| 
17|VerifyCookie|0|2|0||00| 
18|TableLock|0|2|0|wordIndex|00| 
19|Goto|0|2|0||00| 

हो सकता है मैं प्रदर्शन या सुधार करने के लिए एक अतिरिक्त उल्टे सूचकांक निर्माण की जरूरत है ...? धन्यवाद अग्रिम!

+1

आप केवल इस पद्धति का उपयोग कर रहे हैं (यानी साथ शुरू होता है):

आप किसी भी अक्षर हैं जो 'परीक्षण acces' का पालन रखना चाहते हैं तो आप इस प्रयास करना चाहिए? –

+0

हां, बस "aaa%" पैटर्न – ericfang

उत्तर

10

इंडेक्स और like अधिकांश डेटाबेस में साथ नहीं मिलता है। सबसे अच्छा शर्त, एक सीमा के प्रश्न के रूप में क्वेरी पुनर्लेखन के लिए यदि संभव हो तो, क्योंकि सूचकांक तो इस्तेमाल किया जाएगा: (। खुला ब्रेस ASCII वर्ण तुरंत 'z' पीछा कर रहा है)

select * 
from wordIndex 
where word between 'test acces' and 'test acces{' 

यदि आप किसी शब्द की शुरुआत में पैटर्न की तलाश में हैं ('% test' कहें), तो आपको स्वयं को पूर्ण तालिका स्कैन में इस्तीफा देना पड़ सकता है।

संपादित करें:

इंडेक्स और like * do` सबसे डेटाबेस में आजकल साथ मिलता है जब पैटर्न, एक निरंतर के साथ शुरू होता है ताकि आप कर सकते हैं:

select * 
from wordIndex 
where word like 'test acces%' ; 

मैं 100% के बारे में यकीन नहीं है SQLite, हालांकि, यह देखने के लिए निष्पादन योजना की जांच करें कि यह सूचकांक का उपयोग करता है या नहीं।

+0

धन्यवाद गॉर्डन लियोफ, यह रीडली काम करता है। क्वेरी फिर से लिखने से पहले: निष्पादन समय: 1.756531 दूसरा, क्वेरी फिर से लिखने के बाद: निष्पादन समय: 0.011285 मेरे आईपॉड टच 4 पर। – ericfang

+0

टीएनएक्स लेकिन यह मामला संवेदनशील है! – alizx

5

इस प्रयास करें:

SELECT * FROM wordIndex 
WHERE word COLLATE NOCASE BETWEEN @SearchString AND @SearchString || '~~~~~~~~~~' 

"~" सबसे बड़ी ASCII प्रतीक है।

2

मेरे पास गॉर्डन लिनॉफ़ की तुलना में थोड़ा अलग जवाब होगा, लेकिन एक ही दृष्टिकोण के साथ। की तरह के लिए

SELECT * FROM wordIndex 
WHERE word > 'test acces' AND word < 'test accet'; 
संबंधित मुद्दे