我正在构建一个概念数据分析应用程序的证明,使用C# &实体框架。这个应用程序的一部分是计算TF*以色列国防军的分数,这意味着获取包含每个单词的文档数。
我有一个SQL查询(对一个包含大约2,000行的远程数据库)封装在一个foreach循环中:
idf = db.globalsets.Count(t => t.text.Contains("myword"));根据数据集的不同,对于单个报表,此循环将运行50-1,000多次。在一个示例集中,它只需要运行大约50次,它几乎需要一分钟,所以每次查询大约1秒。所以我需要更快的性能才能继续。
对于远程计算机上的MSSQL包含查询,每次查询1秒是否慢?
有哪些途径可以大大改善这一状况?我应该考虑升级数据库所在的web主机吗?运行查询异步?提前运行查询并将结果存储在表中(我假设WHERE =查询要比包含查询快得多?)
发布于 2018-01-10 20:18:05
在这种情况下,您可以比全文搜索做得更好,方法是使用本地机器存储以色列国防军的分数,并在计算完成后返回数据库。世界上所有语言中的单词都不足以耗尽内存:
这应该比你的原版快数千倍,比全文搜索快几百倍。
发布于 2018-01-15 04:17:37
正如其他人所建议的那样,我认为您应该在数据库端实现该查询。看看这篇文章关于 Server全文搜索,这应该是解决问题的方法。
发布于 2018-01-10 19:38:21
在循环中应用contains查询非常糟糕。它扼杀了性能和数据库。您应该改变您的方法,我强烈建议您创建Full Text Search索引并对其执行查询。可以使用查询字符串检索匹配的记录文本。
select t.Id, t.SampleColumn from containstable(Student,SampleColumn,'word or sampleword') C
inner join table1 t ON C.[KEY] = t.Id只执行一次查询,使用操作符(或等等)搜索所需的单词。并检索匹配的文本。然后你可以在记忆中计算TF-以色列国防军的分数。
此外,从Server检索到内存中的文本可能需要很长时间,但这是最好的选择,而不是在循环中应用N个contains查询。
https://stackoverflow.com/questions/48194671
复制相似问题