Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在大表格上搜索文本最有效的方法是什么?_C#_Sql Server_Wcf_Optimization - Fatal编程技术网

C# 在大表格上搜索文本最有效的方法是什么?

C# 在大表格上搜索文本最有效的方法是什么?,c#,sql-server,wcf,optimization,C#,Sql Server,Wcf,Optimization,我需要在一个大约有150000行的表上搜索一个文本字段(varchar 500) 我尝试的第一个选项是直接在db服务器上执行一个存储过程,如下所示: Select p.ProductID, p.ProductDescription, p.SalesPrice From Products p Where p.ProductDescription Like '%' + @PartialDescription + '%' 结果相当缓慢。即使使用ProductDescripti

我需要在一个大约有150000行的表上搜索一个文本字段(varchar 500)

我尝试的第一个选项是直接在db服务器上执行一个存储过程,如下所示:

Select p.ProductID, 
    p.ProductDescription, 
    p.SalesPrice 
From Products p 
Where p.ProductDescription Like '%' + @PartialDescription + '%'
结果相当缓慢。即使使用ProductDescription上的索引,性能也不够快

我提出的下一个解决方案包括以下步骤:

  • 将整个Products表读入Product类型列表并缓存它
  • 每次我需要进行搜索时,我都会遍历集合并进行字符串比较,如下所示

    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;
    
    List searchResultItems=new List();
    for(int i=0;i=0)
    {
    searchResultItems.Add(p);
    }
    }
    返回searchResultItems;
    
  • 这个解决方案比直接在数据库中搜索要快一点。 通过在内存中缓存表,它在很大程度上避免了数据库调用。 然而,与遗留系统(十多年前在FileMaker上构建)相比,它的速度仍然较慢。 我没有访问遗留系统的源代码,也不太了解它

    使用MS SQL Server 2008数据库、在C#上编写的代码以及在System.Runtime.Caching上使用ObjectCache的缓存,我希望我的解决方案能够轻松地超越传统系统。令人尴尬的是,事实并非如此。 如何优化我的搜索方法?我做错了什么?上述函数驻留在一个WCF服务中,由一个web应用程序使用(basicHttpBinding),而不需要任何花哨的控件。我能做些什么使它更快


    直接搜索数据库,这是一个更好的解决方案吗?如何优化它?

    如果您使用的是MS SQL 2008,我建议您使用全文搜索。在您的表上启用FT索引,然后按照FTS提示搜索文本。

    因为您正在搜索带有通配符前缀的值,索引将无法使用,因此它将始终执行表扫描

    你可以调查一下

    即使使用ProductDescription上的索引,性能也不够快

    初学者SQL:

    “%”+@部分描述+'%”

    Triggersa全表扫描,由于起始“%”而无法使用索引。标准索引用于搜索单个单词

    如果你能处理掉这个问题,那么基本上你就可以使用索引,并且应该可以立即得到回报

    在一张大约有150000行的桌子上

    玩具大小。除非您在2gb vps上运行


    我会删除%或转到全文索引。

    那么在db级别(使用FTS)搜索是最好的吗?在应用层这样做毫无意义?(对@Alok也是同样的问题)有什么见解吗?嗯,除非你处理的是少量的行,否则我会在db级别处理。将所有行放回应用程序层并在应用程序层中执行这项操作对于大量数据来说并不是一件好事。一个有150000行的表对您来说是一个“玩具”是吗?先生,你是一个非常聪明的人+感谢你令人鼓舞的评论。我现在要回到我的桌子上玩玩具。谢谢,是的。我生活在这样一个世界里,每天你要将4000万行数据加载到表中。我们在7分钟内处理了450.000个业务对象,其中一些具有接近25万行的详细信息。10年前只有15万人。20年前,foxpro处理100万条记录的行没有问题。现实一点——如今,小型终端上的工作站内存为16gb,数据库服务器内存为250gb。