2013-07-31 15 views
3

我正在研究ASP.NET MVC應用程序。這個應用程序被200個用戶使用。這些 用戶不斷(每5分鐘)從100,000個項目列表中搜索項目(該列表將每個月增加1-2%)。此100,000個項目的列表存儲在SQL Server表中。通過SQL表中100,000條記錄進行通配符搜索的最佳優化技術是什麼

搜索是一個通配符搜索

如:

Select itemCode, itemName, ItemDesc 
from tblItems 
Where itemName like '%SearchWord%' 

的搜索需要非常快,因爲主要業務依賴於搜索和選擇的項目。

我想知道如何獲得最佳性能。搜索結果必須立即出現。

我曾嘗試 -

  1. 我試圖預加載整個10萬條記錄到內存緩存,然後從內存緩存讀取。我試圖避免每次搜索對SQL Server的調用。

    這需要很多時間。每次用戶搜索項目時,我們都會從內存緩存中檢索100,000條記錄,然後再進行搜索。這比直接的SQL搜索多花費2-3倍的時間。

  2. 我想這樣做在SQL Server表直接進行搜索,但在一個時間限制的結果,只有50條記錄(使用前50名)

    這似乎是好了,但仍然沒有在那裏附近的表現,我們正在尋求

我想聽聽可能的解決方案和任何文章/代碼的鏈接。

在此先感謝

+0

你能否詳細說明你的應用程序的架構多一點?當執行關鍵字搜索時,它是一個確切的關​​鍵字還是通配符/變形?作爲一般規則,您應該將搜索工作留給數據庫。 – Phill

+0

這是一個*全文目錄*搜索或「LIKE」? –

+0

Hi Phill,它將成爲通配符搜索。 – NewUnhandledException

回答

2

運行SQL事件探查器並執行調整配置文件。這將建議索引針對您的數據庫執行。

另外,像下面這樣的查詢是值得一試的。

SELECT * 
FROM  
( 
    SELECT ROW_NUMBER() OVER (ORDER BY ColumnA) AS RowNumber, itemCode, itemName, ItemDesc 
    FROM  tblItems 
    WHERE  itemName LIKE '%FooBar%' 
) AS RowResults 
WHERE RowNumber >= 1 AND RowNumber < 50 
ORDER BY RowNumber 

編輯:更新查詢,以反映你的真實場景。

0

怎麼樣有沒有領先的通配符作爲主搜索的搜索....

Where itemName like 'SearchWord%' 

,然後讓有「更多結果」按鈕加載

Where itemName like '%SearchWord%' 

(或者排除來自第一個結果集的結果)

Where itemName not like 'SearchWord%' and itemName like '%SearchWord%' 
0

一個奇怪的替代方案可能工作,因爲它取決於幾個假設等。對不起沒有完全解釋,但我使用iPad很難打字。(是的,這個解決方案已經在高TXN提供商業系統中使用)

這是假設

  1. 查詢是否CPU不受限IO
  2. 這ITEMNAME不要太長,這樣,它擁有所有字母和數字
  3. 即搜索內容,總共包含了足夠的選擇字符和心不是隻是很普通的字符
  4. 您的選擇謂詞由%約束喜歡%

其基本思想是擴展您的查詢,以幫助優化器知道哪些行需要類似掃描。

步驟1.設置功能設置表

創建每個字母/數字的附加26個或36列。當我真正做到這一點時,它一直是一個單獨的表格,但將它放在源表格上應該適用於像100k這樣的小容量。讓我們致電colmns trig_a,trig_b等

每個插入/編輯創建觸發器/刪除,並把一個1或0到trig_a場,如果它包含了一個「一」,所有的26/36列做到這一點。這樣做的觸發很複雜,但可能(至少使用Oracle)。如果你陷入困境,我確信你可以創造它,或者我可以把它挖出來。

在這一點上,我們有一系列的列指示字段是否包含字母/數字等

第2步:幫助您查詢

有了這個額外的信息,我們的位置幫助優化器。以下添加到您的查詢

Select ... Where .... And 
((trig_a > 0) or (searchword not like '%a%')) and 
((trig_b > 0) or (searchword not like '%b%')) and 
    ... Repeat for all columns monitored... 

如果優化器的行爲,它可以使用(希望)成本較低場> 0謂詞,以減少評估等等謂詞。

注意事項。

  1. 您可能需要強制優化器掃描trig_?字段第一個
  2. 索引可以幫助trig_?字段,特別是如果在源表
  3. 我沒有顯示如何處理大寫/小寫,不要忘記處理這個
  4. 你可能會發現只需要做幾個字母就是你需要做的。
  5. 這種技術不會爲類似的每種應用提供性能提升,所以它不是一種通用技術,適用於任何你喜歡的地方。
相關問題