我们正在尝试诊断复杂存储过程中的缓慢(它有几个巨大的查询)。
当我们从 ASP.NET 调用 SP 时,需要 5 秒。
当我们从 SQL Management Studio 调用它时(仅使用 EXEC),它需要 0.05 秒。
我们已经在许多不同的方式和环境中一致地测试了这种行为。
这是针对 C#.NET 的。数据库为 MS SQL Server 2012。
问题出在 Web 应用程序上,但我们编写了一个小型控制台应用程序作为测试工具,并且行为是相同的。
1) 我们在 C#.NET 控制台应用程序中计算耗时,如下所示:
stopwatch.Start();
rdr = cmd.ExecuteReader();
stopwatch.Stop();
2) 我们通过在查询前后调用 GETDATE() 来计算 SQL 过程中耗时,然后将这些时间存储在一个小表中。我们可以在 SQL Mgmt Studio 中查询该表,以查看 SP 内部的查询花费了多长时间。
通过这种方式,我们可以看到在 SQL 上花费了多少时间与整体相比,99% 的时间都花在了 SQL 上。
但如果它在 SQL Mgmt Studio 中不是也很慢,则很难调试和改进。
所以我的问题是,为什么会有所不同?可能是 SQL Mgmt Studio 的锁定方式与控制台应用程序不同吗?
最佳答案
这种行为通常源于您从 ADO.NET 和 SSMS 获得不同的执行计划这一事实。这是因为执行计划不仅要考虑 SQL 本身,还要考虑 ANSI_NULLS、ARITHABORT 和其他几个设置形式的上下文。因此,如果这些设置不同,则一个环境中的执行计划无法在另一个环境中使用。
在默认设置下,SSMS 和 ADO.NET 中的一切都相同,除了 ARITHABORT。这在 ADO.NET 中设置为 OFF,在 SSMS 中设置为 ON,因此要获得与您的应用程序相同的缓存查询计划,您需要在 SSMS 中将 ARITHABORT 设置为 OFF。现在,您应该会在 SSMS 中看到与应用程序调用相同的性能。在这篇不错的博客文章中查看更多背景信息:http://www.sommarskog.se/query-plan-mysteries.html
如果您的查询返回大量数据,则还有另一个因素,因为默认情况下 SSMS 会读取所有数据并在完成并显示总查询时间之前显示这些数据。它的读取速度取决于您在服务器本地或远程执行 SSMS 的位置。在远程的情况下,数据必须通过网络传输,这通常比本地调用慢。通常,测量传输时间是可以的,因为您的应用程序也是如此。但是,SSMS 还会显示 数据,这可能比实际加载数据花费的时间长得多。为防止这种情况,您可以通过“工具->选项->查询结果->SQL Server->结果到网格->执行后丢弃结果”禁用 SSMS 中的数据显示。
如果您仍然遇到不同的行为,请通过 SQL Profiler 捕获执行计划并进行比较。
关于c# - 从 ASP.NET 与 SQL Mgmt Admin 调用时存储过程速度较慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17364487/
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
是的,我知道最好使用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
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur
我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于