【发布时间】:2012-02-12 03:19:35
【问题描述】:
我需要在大约 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;
这个解决方案比直接在数据库中搜索要快一点。 通过将表缓存在内存中,在很大程度上避免了数据库调用。 但是,与遗留系统(10 多年前在 FileMaker 上构建)相比,它仍然很慢。 我没有接触到遗留系统的源代码,对它了解不多。
使用 MS SQL Server 2008 数据库、使用 C# 编写的代码和使用 System.Runtime.Caching 上的 ObjectCache 进行缓存,我期待我的解决方案能够轻松超越旧系统。尴尬的是,事实并非如此。 如何优化我的搜索方法?我究竟做错了什么?上面的函数驻留在 WCF 服务中,并由没有任何花哨控件的 Web 应用程序使用(basicHttpBinding)。我该怎么做才能让它更快?
直接搜索数据库,是否可以通过任何优化成为更好的解决方案?如何优化它?
【问题讨论】:
标签: c# sql-server wcf optimization