C# 如何处理Entity Framework/MS-SQL中的Contains查询性能缓慢的问题?
我正在使用C#&实体框架构建一个概念验证数据分析应用程序。这个应用程序的一部分是计算TF*IDF分数,这意味着获得包含每个单词的文档数 我有一个SQL查询(到一个大约有2000行的远程数据库)封装在foreach循环中: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秒。因此,我需
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:
这应该比原始搜索速度快数千倍,比全文搜索速度快数百倍。在这种情况下,通过使用本地计算机存储idf分数,并在计算完成后回写到数据库,您可以做得比全文搜索好得多。世界上所有语言中都没有足够的单词让您耗尽RAM:
这应该比原始搜索快数千倍,比全文搜索快数百倍。正如其他人所建议的,我认为应该在数据库端实现该查询。请看一下关于SQL Server全文搜索的内容,这应该是解决问题的方法。正如其他人所建议的,我认为您应该在数据库端实现该查询。看看关于SQL Server全文搜索,这应该是解决问题的方法。包含与
相同,如“%word%”
,该搜索无法使用索引,因此速度会很慢,因为每次都需要对表进行完整扫描。你需要使用或向我们展示你想要做什么。很可能你可以在一个循环中完成整个循环query@Steve我已经将一个文档拆分为单个单词,需要得到每个单词的反向文档频率(我整个数据库中有多少文档包含该单词)。因此,一个1000单词的文档可能有200个唯一单词,我正在查询数据库中的每个文档,以确定有多少其他文档包含该单词。那么,您将整个文档存储在数据库中的一列中,并且在一个表中有多行文档?举一个更好的例子,contains与“%word%”之类的相同,搜索不能使用索引,因此速度会很慢,因为每次都需要对表进行完整扫描。你需要使用或向我们展示你想要做什么。很可能你可以在一个循环中完成整个循环query@Steve我已经将一个文档拆分为单独的单词,需要得到每个单词的反向文档频率