在网上搜索了许多讨论,涵盖了我的问题的各个方面,但我没有看到适用于此的模式:
我有一个使用 EF 3.5 和 MySQL 的基本 .NET WinForm 应用程序。该应用程序可以很好地处理大多数查询,但任何包含 Distinct() 的查询都非常慢或导致“在操作完成之前超时时间已过或服务器没有响应。”机器重启后第一次运行时出现异常。 IE。重新启动应用程序时,即使在停止并重新启动 MySQL 服务之后,Distinct() 查询从现在起也能正常工作(即花费不到 1 秒)。
我无法通过重新运行应用程序或重新启动 MySQL 来重现问题这一事实排除了 EF 编译或 MySQL 缓存是一个因素。仅在重新启动后问题再次出现。让我觉得这可能是 .NET 初始化问题或与操作系统相关的其他问题。该问题已在 XP 和 Win 7 上观察到。
任何想法都会受到赞赏。 (还有关于在不重新启动机器的情况下尝试重现问题的想法,这是非常不切实际的:-)
EF 生成的查询如下所示:
SELECT Distinct1.C2 FROM (
SELECT DISTINCT YEAR(Extent1.RecDate) AS C2
FROM dailyrecord AS Extent1
WHERE (Extent1.STN = 430030) AND (Extent1.WBAN = 99999)
) AS Distinct1;
第一次在 mysql shell 中运行它大约需要 30 秒,即使在重新启动 mysql 之后,所有后续时间都需要大约 1 秒。重启后回到30s。操作系统似乎是第一次读取整个 db 文件,但之后就没有了(后续查询的 HD 事件非常少,即使查询参数已修改)。
如何刷新操作系统的读取缓存来检验我的理论?
最佳答案
经过相当多的测试后,结果如下:
根据定义,许多查询在 MySQL 和可能 (m) 任何 DBMS 中都非常慢,因为它们需要读取整个数据文件,例如上面的“DISTINCT”查询,其中“WHERE”子句包括主键的一部分,但不是整个主键(在本例中是 4 个字段的组合)。
如果慢速查询在应用程序中很常见且令人烦恼,则应在搜索条件(“WHERE”字段)上添加索引。这将大大加快查询速度(并最终解决了最初发布的问题),但它会增加磁盘上数据(.MYI 文件)的大小,同时略微减小 .MYD 文件的大小,但整体增加总数据大小。添加索引可能会增加 INSERT、UPDATE 和 DELETE 查询的时间,因为索引也需要更新。 插入 大多是在一个接一个的基础上完成的,因此性能损失通常不明显。与批量 DELETE 查询不同(见下文。)
查询的低效被操作系统(在我的例子中是 MS Windows XP)掩盖了。任何需要逐条记录读取整个表的查询在第一次遇到时都非常慢。但是,操作系统将缓存文件,即使参数发生变化,后续查询也会更快很多,即使查询本身发生变化:任何需要读取整个表文件的低效查询都会很快出现一次它由操作系统缓存。这使得调整查询变得困难,因为您需要在测试之间重新启动操作系统。在网上搜索之后,我还没有找到在 Windows 中刷新读取缓存的实用方法。
一个相关的低效查询是:DELETE FROM myTable WHERE field1 = value。如果有很多记录(在我的例子中,10,000 条记录需要 30 秒)要删除(在所有这些示例中使用 MySQL,存储引擎 MYISAM),即使 field1 上有索引,这也会很慢。这是因为 DBMS 需要从磁盘读取(也可能写入)整个表文件(取决于 DELETE 的物理执行方式)。同样,这将被操作系统掩盖:第一次很慢,但在随后的查询中相当快(在我的 XP 机器上快 30 倍),因为操作系统有一些魔法,很难(不可能?)关闭.如上所述添加索引可能会增加删除查询所需的时间。
如有任何想法或意见,我们将不胜感激!
关于.net - EF 查询包含 "Distinct()"第一次慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13453282/
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr