2012-01-25 72 views
3

現狀:提高「%LIKE%」的Firebird數據庫查詢

我想寫使用「喜歡」一個有效的查詢語句來一段文字與短文一列之後的樣子。

型號:

Table 'EVENTSGENERAL' : { ID (KEY), GENERATOR_ (FK), DATETIME, COMPUTERNAME, OSLOGIN, DBLOGIN, INFOTYPE, INFO } 

Table 'EVENTSGENERATORS' : { ID (KEY), GENERATOR_ (FK), SHORTNAME, LONGNAME } 

Table 'EVENTSINFOTYPES' : { ID (KEY), GENERATOR_ (FK), VERSION_, INFOTYPE, DESCRIPTION } 

指標:EVENTSGENERAL.GENERATOREVENTSGENERAL.DATETIMEEVENTSINFOTYPES.INFOTYPE 所有提升。

我的查詢:

SELECT FIRST @first SKIP @skip A.ID,B.LONGNAME, A.DATETIME, A.COMPUTERNAME,A.OSLOGIN, A.DBLOGIN, C.DESCRIPTION, A.INFO 
FROM EVENTSGENERAL A JOIN EVENTSGENERATORS B ON B.GENERATOR_ = A.GENERATOR_ 
JOIN EVENTSINFOTYPES C ON C.GENERATOR_ = A.GENERATOR_ AND C.INFOTYPE = A.INFOTYPE 
WHERE C.DESCRIPTION LIKE '%VALUE%' 

問題:

這個查詢將在超大數據庫上運行。有什麼辦法可以改善它嗎? 我正在使用Firebird數據庫。

在此先感謝。

回答

7

不,不幸的是,因爲您在LIKE關鍵字的兩側使用了通配符(%)。前導(開始)通配符意味着沒有索引可用於幫助提高搜索速度,因此必須檢查每一行以查看它是否符合標準。

您可以通過更改爲LIKE 'VALUE%'來加快速度;一個索引至少可以用來限制搜索行到那些以VALUE開頭的行。

+0

如果我使用「LIKE%」,而不是什麼會改變?會更快嗎? –

+0

如果您的意思是LIKE'VALUE%',那麼您應該可以將VALUE編入索引以獲得一些性能提升。您可以嘗試創建索引,然後執行Filebird的「解釋計劃」。 –

+0

編輯爲在查詢速度中包含'LIKE'VALUE%''效果。 –

3

全文搜索(使用%VALUE%)很慢,因爲沒有有效的方法來做到這一點。這就像抓詞典來製作一個包含包含字母Q的所有單詞的列表。這需要永久。另一方面,如果你只是尋找VALUE%這很容易(如果搜索字段索引)。這就像製作一個開始於字母Q的所有單詞列表。如果單詞按字母順序排序(就像它們在字典中一樣),這很容易。你可以很容易找到第一個和最後一個單詞,並且你可以確定你需要的是一切,而不是其他的。

有些數據庫允許進行全文搜索,他們可以對列中的每個單詞進行索引,但只對整個單詞進行索引。因此,搜索%q%仍然會很慢,搜索q%會更快。我不確定Firebird是否支持它。

如果你有一個大的數據庫,並且希望能夠搜索%q%,你應該考慮其他的,專業化的解決方案,如LuceneXapian

+0

感謝您的解釋,它最終索引數據庫並使用'Word%'查詢來加快速度。這不是我想要的,但至少現在有幫助。 第一次發佈後,我可能會檢查lucene,看它是否符合我的需求。 再次感謝! –

+0

我看到什麼問題「El CorteInglés」如果我寫「el」有沒有一種方法來增加單詞的資本或不 –