2012-10-25 33 views
1

我需要一些幫助在這裏,我在條件有「喜歡」在SQL運營商的任何替代 - 用於搜索數據

在這裏,我使用像運營商,其中客戶端可以使用搜索與任何讀取數據依賴因此我有下面的邏輯,但是這裏的檢索時間太長(需要4分鐘)才能獲得太慢的數據。

我做了所有索引到表,但仍不能優化查詢。

選擇*來自作者 其中(地址類似'%Walmart%'或地址類似'Walmart%'或地址類似'%Walmart'或地址類似'%Walmart.com%'或地址類似'Walmart.com% '地址'%Walmart.com'或者地址'%Walmarts%'或者地址如'Walmarts%'或者地址如'%Walmarts'或者地址如'%Walmarts.com%'或者地址如'Walmarts.com% 'OR地址LIKE '%Walmarts.com')

- 結果爲1點的行

如果我遵循這一邏輯

SELECT * FROM作者 其中LIKE「%沃爾瑪%」

地址 - 結果是44行 - 這是獲取所有的行

但我需要只有一個行

+5

你爲什麼允許這種類型的搜索連接在一起,這就是爲什麼需要這麼長。看看你喜歡多少列。 – JonH

+5

您是否發現冗餘子句可以提高性能?搜索''%'+ @word +'%''應該涵蓋'@ word',''%'+ @ word'和''@word +'%''。等等。 – HABO

+0

我必須檢查只有一列,但由於這種情況下花費太長的時間來檢索數據....如果你知道任何更好的解決方案,讓我知道...先謝謝 – sairam02

回答

2

它很可能索引不會幫助。在很多情況下,當您使用Like語句時,不能使用索引。您所允許的搜索類型效率非常低。這個查詢很可能會掃描地址表。如果表格中有相當數量的行,這將需要很長時間,正如您所看到的。

您可能最好查看全文searching

+0

我在該列上進行了全文搜索,但仍無法對其進行優化 – sairam02

+0

全文索引之後您的查詢是什麼?您是否使用包含關鍵字? – HLGEM

0

這樣一個通配符搜索將不被索引的幫助下,嘗試尋找在全文檢索,而不是

這將利用索引,它可能會做一個尋求

address like @wordcom+' % 

這不會利用索引,它必須掃描整個索引

address like '% '[email protected]+' %' 

像上面提到的,使用全文SEACH代替

3

我相信這是你的where子句中唯一需要的東西,它應該覆蓋包含這個詞的一切:

select * from authors 
where address like '%' + @word + '%' 

你實際上已經在where子句中的第二行這樣做:

or like '%'[email protected]+'%' 

而且這涵蓋了一切,使所有其他的過度。刪除這些可能會加速它的一點點:

declare @title varchar(20) 

set @title = 'coll' set @title = LTRIM(rtrim(@title)) 

select * from authors 
where address like '%'[email protected]+'%' 
0

正如其他人所說,你需要的是

select * from authors where address like '%' + @word + '%' 

這可能不是加快速度了,如果優化想通了什麼,我們告訴你。 (索引也無濟於事,其他人使用全文搜索也是一個很好的建議)。

如果你不知道爲什麼上面的查詢是你所需要的,讓我們看看你的查詢:

select * from authors 
where address like @word or address like '% '+ @word 
or address like @word+' %' or address like '%'[email protected]+'%' 
or address like '% '[email protected]+' %' or address like @words 
or address like '% '[email protected] or address like @words+' %' 
or address like '%'[email protected]+'%' or address like '% '[email protected]+' %' 
or address like @wordcom or address like '% '[email protected] 
or address like @wordcom+' %' or address like '%'[email protected]+'%' 
or address like '% '[email protected]+' %' or address like @wordscom 
or address like '% '[email protected] or address like @wordscom+' %' 
or address like '% '[email protected]+' %' 

你有一個「像@word +‘%’」,所以請注意如果一條記錄匹配「像@word」那麼它也會匹配「like @word +'%'」。所以@word不會添加任何更多結果。由於「或」,結果將與@word正在嘗試匹配的結果相同,或者您僅擁有@word +'%'的結果。

運用這個邏輯,你的查詢可以簡化爲:

select * from authors 
where address like @word+' %' or address like '%'[email protected]+'%' 
or address like @words+' %' or address like '%'[email protected]+'%' 
or address like @wordcom+' %' or address like '%'[email protected]+'%' 
or address like @wordscom+' %' or address like '% '[email protected]+' %' 

同樣,@word不添加任何「%」 + @一句話都沒有包括這從而簡化了查詢:

select * from authors 
where address like '%'[email protected]+'%' 
or address like '%'[email protected]+'%' 
or address like '%'[email protected]+'%' 
or address like '% '[email protected]+' %' 

此外,通過什麼 '%' 發現+ @ +字 'S%', '%'[email protected]+'.com%' 或 '%'[email protected]+'s.com%' 會被'發現% '+ @ +字' %」。

+0

感謝您的邏輯,但在我的senario中,如果我使用此AND(HD.address,如'%Walmart%'或HD.address,如'Walmart%'或HD.address,如'%Walmart'或HD.address' %Walmart.com%'或'HD.address''Walmart.com%'或'HD.address''%Walmart.com' 或HD.address like'%Walmarts%'或HD.address like'Walmarts%' HD.address like'%Walmarts'或HD.address like'%Walmarts.com%'或HD.address like'Walmarts.com%' 或HD.address like'%Walmarts.com') - 結果爲1行,如果我跟着 - 和HD。標題如'%Walmart%' - 結果爲44行 – sairam02

+0

在上面的註釋中,您在地址字段之間進行了類似的切換,並在標題字段中進行了切換。我相信AND(HD.address就像'%Walmart%')會給出與所有類似聲明的OR相同的結果。 –

+0

如果您可以找到一條記錄,該記錄在一個查詢中返回,但不在另一個查詢中(在%@ word @和OR版本之間),請告訴我們該字段的值是多少。我們中的很多人都說這個查詢應該有完全相同的結果。 –

0

如果您在QUERY中使用LIKE,請使用double %%包裝要過濾的值。 這是最好的解決方案。如果您喜歡解決方案,請投票。 例如,在這種情況下,我與主查詢

filter_value = "'%%"+filter_value+"%%'"