从C#VS SSMS执行相同的请求会产生不同的执行时间


12

我有这样的要求

SELECT 
[EstimateId], 
[CreationUserId], 
[EstimateStatusValueId], 
[LanguageId], 
[LocationId], 
[EstimatorUserId], 
[FilterUnitSystemTypeId], 
[EstimateNumber], 
[RevisionNumber], 
[CreationDate], 
[ModificationDate], 
[ProjectDescription], 
[IsBsdq], 
[ClosingDate], 
[ClosingTime], 
[ClosingUpdatedOn], 
[DeadLineDate], 
[IsReceived], 
[Inclusion], 
[Exclusion], 
[Misc], 
[Note], 
[WorkDeadLines], 
[Comments], 
[Validity], 
[PlansLocation], 
[PlansReceivedFrom], 
[Price]
FROM [Estimate].[Estimates] 
ORDER BY [ClosingDate] ASC, [ClosingTime] ASC

当我在SSMS中运行此查询时,我的执行时间为953ms,但是当我从C#中的Linq查询中运行此查询时,我的执行时间为1813ms。

Linq查询使用“ .Net SqlClient数据提供程序”,并针对EntityFramework(EDMX文件)发出。这可能是一个问题吗?

有谁知道为什么我在相同请求但针对同一数据库从不同上下文执行的那些请求的执行时间之间有很大差异?

我验证了两个请求的所有执行计划,并且它们使用相同的索引来满足各自的查询。

为了查看C#请求的执行计划,我使用SQL事件探查器捕获了Show Plan XML事件,并将其与SSMS之一进行比较,并且两者相同。


只是一个小问题-为什么您在没有任何搜索条件的情况下选择所有表的数据?您是否真的需要应用程序中的所有数据而没有任何过滤?
玛丽安(Marian)

是的,这是我需要的功能,但是该功能不会经常使用。我知道在没有where子句的情况下发出大查询并不是最佳选择。
Nico

无论如何,我关心的不是请求本身,而是执行时间之间的差异。我向您显示此查询,但所有查询都给出相似的结果。为什么呢
Nico

Answers:


6

这是一次又一次的一致性吗?

我看到了CPU差异,这可能是编译时间。是否有任何影响此的LINQ设置?

编辑:

  • 在Profiler中捕获计划
  • 您确定Profiler中的SQL相同吗?

是的,它一次又一次地保持一致。我不知道linq设置。但我发现此链接codeproject.com/KB/cs/linqsql2.aspx
Nico

您可以在上图中看到两个查询的计划。是的,我确定SQL事件探查器中的SQL是相同的。SQL,Profiler,SSMS和C#应用程序都托管在我的计算机上以用于开发目的。
Nico

从Profiler 捕获XML中的实际计划。不是来自缓存。您有不同的回答,但您显示了不同的计划=上面显示的计划有误
gbn


3

您将要查看两个查询的执行计划,并查看它们的不同之处。


我只是编辑我的帖子...并且我已经验证了两个查询使用的是同一计划。
Nico

1
我只是将您告诉我的事件添加到事件探查器中,这与我在问题中发布的最后一个请求相同。我有相同的计划..其他任何想法...
Nico

2
一切看起来都正确。唯一可以解释的问题是.NET应用程序没有足够快地接收数据。SQL Profiler中报告的时间包括将数据从服务器传输到客户端的时间。因此,如果客户端没有足够快地下载所有内容,则报告的运行时间将更长。
mrdenny

2
然后是应用程序如何处理数据以及如何从数据库读取数据。
mrdenny

3
为了支持mrdenny的答案,我还要补充一点,尽管IO统计信息和执行计划是相同的,但我在3个不同的SQL客户端中测试了一个查询,并且它们的报告时间都不同。这都是由客户端如何处理数据的内部方式引起的。我相信,通过输出到文件,Management Studio中的网格或文本输出,可以获得不同的时间结果。无论如何,据我所记得,文档说SQL总是比LINQ to SQL快,所以这并不奇怪:-)。
玛丽安
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.