Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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# 如何处理Entity Framework/MS-SQL中的Contains查询性能缓慢的问题?_C#_Sql Server_Performance_Entity Framework - Fatal编程技术网

C# 如何处理Entity Framework/MS-SQL中的Contains查询性能缓慢的问题?

C# 如何处理Entity Framework/MS-SQL中的Contains查询性能缓慢的问题?,c#,sql-server,performance,entity-framework,C#,Sql Server,Performance,Entity Framework,我正在使用C#&实体框架构建一个概念验证数据分析应用程序。这个应用程序的一部分是计算TF*IDF分数,这意味着获得包含每个单词的文档数 我有一个SQL查询(到一个大约有2000行的远程数据库)封装在foreach循环中: idf = db.globalsets.Count(t => t.text.Contains("myword")); 根据我的数据集,对于单个报告,此循环将运行50-1000多次。在一个只需运行大约50次的样本集上,它几乎需要一分钟,因此每个查询大约需要1秒。因此,我需

我正在使用C#&实体框架构建一个概念验证数据分析应用程序。这个应用程序的一部分是计算TF*IDF分数,这意味着获得包含每个单词的文档数

我有一个SQL查询(到一个大约有2000行的远程数据库)封装在foreach循环中:

idf = db.globalsets.Count(t => t.text.Contains("myword"));
根据我的数据集,对于单个报告,此循环将运行50-1000多次。在一个只需运行大约50次的样本集上,它几乎需要一分钟,因此每个查询大约需要1秒。因此,我需要更快的性能才能继续

远程计算机上的MSSQL contains查询的每个查询是否慢1秒


有哪些途径可以显著改善这一点?我应该考虑升级数据库所在的web主机吗?异步运行查询?提前运行查询并将结果存储在表中(我假设WHERE=查询比CONTAINS查询快得多?

在循环中应用
CONTAINS
查询是一个非常糟糕的主意。它破坏了性能和数据库。您应该改变方法,我强烈建议您创建
全文搜索
索引并对其执行查询。您可以使用查询字符串检索匹配的记录文本

select t.Id, t.SampleColumn from containstable(Student,SampleColumn,'word or sampleword') C 
inner join table1 t ON C.[KEY] = t.Id
只执行一个查询,输入使用运算符(或等)搜索的所需单词,然后检索匹配的文本。然后,您可以在内存中计算TF-IDF分数


另外,仍然从SQL Server检索文本到内存中可能需要很长时间才能流式处理,但这是最好的选择,而不是在循环中应用N
contains
query。

在循环中应用
contains
query是一个非常糟糕的主意。它破坏了性能和数据库。您应该改变方法,我强烈建议您创建
全文搜索
索引并对其执行查询。您可以使用查询字符串检索匹配的记录文本

select t.Id, t.SampleColumn from containstable(Student,SampleColumn,'word or sampleword') C 
inner join table1 t ON C.[KEY] = t.Id
只执行一个查询,输入使用运算符(或等)搜索的所需单词,然后检索匹配的文本。然后,您可以在内存中计算TF-IDF分数


此外,从SQL Server中检索文本到内存可能需要很长时间,但这是最好的选择,而不是在循环中应用N
contains
query。

在这种情况下,通过使用本地计算机存储idf分数,可以比全文搜索做得更好,并在计算完成后写回数据库。世界上所有语言中都没有足够的单词让您耗尽RAM:

  • 创建字典文档频率
  • 依次加载数据库中的每个文档,并将其拆分为单词,然后应用词干分析。然后,对于文档中每个不同的词干,在documentFrequency字典中的值上添加1
  • 以这种方式处理所有文档后,将文档频率写回数据库
  • 现在,只需通过以下方法即可计算给定文档中给定术语的tf idf:

  • 加载文档

  • 计算术语的实例数
  • 从数据库中的idf表加载正确的idf分数
  • 进行tf idf计算

  • 这应该比原始搜索速度快数千倍,比全文搜索速度快数百倍。

    在这种情况下,通过使用本地计算机存储idf分数,并在计算完成后回写到数据库,您可以做得比全文搜索好得多。世界上所有语言中都没有足够的单词让您耗尽RAM:

  • 创建字典文档频率
  • 依次加载数据库中的每个文档,并将其拆分为单词,然后应用词干分析。然后,对于文档中每个不同的词干,在documentFrequency字典中的值上添加1
  • 以这种方式处理所有文档后,将文档频率写回数据库
  • 现在,只需通过以下方法即可计算给定文档中给定术语的tf idf:

  • 加载文档

  • 计算术语的实例数
  • 从数据库中的idf表加载正确的idf分数
  • 进行tf idf计算

  • 这应该比原始搜索快数千倍,比全文搜索快数百倍。

    正如其他人所建议的,我认为应该在数据库端实现该查询。请看一下关于SQL Server全文搜索的内容,这应该是解决问题的方法。

    正如其他人所建议的,我认为您应该在数据库端实现该查询。看看关于SQL Server全文搜索,这应该是解决问题的方法。

    包含与
    相同,如“%word%”
    ,该搜索无法使用索引,因此速度会很慢,因为每次都需要对表进行完整扫描。你需要使用或向我们展示你想要做什么。很可能你可以在一个循环中完成整个循环query@Steve我已经将一个文档拆分为单个单词,需要得到每个单词的反向文档频率(我整个数据库中有多少文档包含该单词)。因此,一个1000单词的文档可能有200个唯一单词,我正在查询数据库中的每个文档,以确定有多少其他文档包含该单词。那么,您将整个文档存储在数据库中的一列中,并且在一个表中有多行文档?举一个更好的例子,contains与“%word%”之类的
    相同,搜索不能使用索引,因此速度会很慢,因为每次都需要对表进行完整扫描。你需要使用或向我们展示你想要做什么。很可能你可以在一个循环中完成整个循环query@Steve我已经将一个文档拆分为单独的单词,需要得到每个单词的反向文档频率