我需要在大約150,000行的表上搜索一個文本字段(varchar 500)。在大桌子上搜索文字的最有效方法是什麼?
Select p.ProductID,
p.ProductDescription,
p.SalesPrice
From Products p
Where p.ProductDescription Like '%' + @PartialDescription + '%'
結果是相當緩慢:
我嘗試的第一個選項是直接它看起來像在數據庫服務器上執行的存儲過程。即使使用ProductDescription索引,性能也不夠快。
我在下面的步驟與作品來到了下一個解決方案:
- 閱讀整個產品表到產品類型列表,並將它緩存。
每次我需要做一個搜索,我去通過收集和做字符串對比如下
List<Product> searchResultItems = new List<Product>(); for (int i = 0; i < cachedProducts.Count; i++) { Product p = cachedProducts[i]; if (p.Description.IndexOf(partialDescription, StringComparison.OrdinalIgnoreCase)>=0) { searchResultItems.Add(p); } } return searchResultItems;
這個解決方案不是直接搜索到數據庫快一點。 通過在內存中緩存表,它可以在很大程度上避免數據庫調用。然而,它與傳統系統(FileMaker 10多年前構建的)相比仍然很慢。 我無法訪問遺留系統的源代碼,不太瞭解它。
使用MS SQL Server 2008數據庫,使用C#編寫的代碼和使用System.Runtime.Caching上的ObjectCache的緩存,我期待我的解決方案輕鬆勝過傳統系統。令人尷尬的是,事實並非如此。 如何優化我的搜索方法?我究竟做錯了什麼?上面的函數駐留在WCF服務中,並且由Web應用程序使用(basicHttpBinding)而沒有任何花哨的控制。我能做些什麼來使其更快?
直接搜索數據庫,它可以是任何優化的更好的解決方案嗎?我怎樣才能優化它?
因此,搜索數據庫級別(與FTS)是最好的?沒有任何意義在應用層中完成它? (對@Alok也是同樣的問題)任何見解? – Romeo 2012-01-17 11:53:29
恕我直言,除非你正在處理少量的行,那麼我會在數據庫級別。返回所有行並在應用程序層執行它對於大量數據來說並不會很好。 – AdaTheDev 2012-01-17 11:57:47
謝謝,會嘗試FTS。 – Romeo 2012-01-17 12:02:23