首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理实体框架/ MS-SQL中包含查询的缓慢性能?

如何处理实体框架/ MS-SQL中包含查询的缓慢性能?
EN

Stack Overflow用户
提问于 2018-01-10 19:23:47
回答 3查看 1.8K关注 0票数 0

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

我有一个SQL查询(对一个包含大约2,000行的远程数据库)封装在一个foreach循环中:

代码语言:javascript
复制
idf = db.globalsets.Count(t => t.text.Contains("myword"));

根据数据集的不同,对于单个报表,此循环将运行50-1,000多次。在一个示例集中,它只需要运行大约50次,它几乎需要一分钟,所以每次查询大约1秒。所以我需要更快的性能才能继续。

对于远程计算机上的MSSQL包含查询,每次查询1秒是否慢?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-01-10 20:18:05

在这种情况下,您可以比全文搜索做得更好,方法是使用本地机器存储以色列国防军的分数,并在计算完成后返回数据库。世界上所有语言中的单词都不足以耗尽内存:

  1. 创建一个字典Dictionary documentFrequency
  2. 依次加载数据库中的每个文档,然后分割成文字,然后应用词干。然后,对于文档中的每个不同的词干,向documentFrequency字典中的值添加1。
  3. 在以这种方式处理所有文档之后,将文档频率写回数据库。
  4. 现在,只需通过以下方式计算给定文件中某一特定期限的tf-以色列国防军:
  5. 加载文档。
  6. 计算术语的实例数。
  7. 从数据库中的以色列国防军表中加载正确的以色列国防军得分。
  8. 做tf-以色列国防军的计算。

这应该比你的原版快数千倍,比全文搜索快几百倍。

票数 1
EN

Stack Overflow用户

发布于 2018-01-15 04:17:37

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

票数 1
EN

Stack Overflow用户

发布于 2018-01-10 19:38:21

在循环中应用contains查询非常糟糕。它扼杀了性能和数据库。您应该改变您的方法,我强烈建议您创建Full Text Search索引并对其执行查询。可以使用查询字符串检索匹配的记录文本。

代码语言:javascript
复制
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查询。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48194671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档