我在与实体框架的一些问题。我从数据库中的一个视图下执行一个简单的选择。然而,当我查看EF生成SQL,则执行使用两倍从选择的查询。这是它应该工作的方式吗?这似乎非常低效的。

var reads = (from rt in ctx.C2kReadsToTransfer
                     where rt.ReadDt > fromDate
                     && rt.ReadDt < toDate
                     select rt);

此被转换为以下SQL

SELECT 

 [Extent1].[AMRID] AS [AMRID]
 , [Extent1].[Comments] AS [Comments]
 , [Extent1].[ExternalSystemType] AS [ExternalSystemType]
 , [Extent1].[LastReadDt] AS [LastReadDt]
 , [Extent1].[ReadDt] AS [ReadDt]
 , [Extent1].[Reading] AS [Reading]
 , [Extent1].[Units] AS [Units]
 , [Extent1].[Transferred] AS [Transferred]



 FROM 
     (SELECT 
      [ReadsToTransfer].[AMRID] AS [AMRID]
      , [ReadsToTransfer].[Comments] AS [Comments]
      , [ReadsToTransfer].[ExternalSystemType] AS [ExternalSystemType]
      , [ReadsToTransfer].[LastReadDt] AS [LastReadDt]
      , [ReadsToTransfer].[ReadDt] AS [ReadDt]
      , [ReadsToTransfer].[Reading] AS [Reading]
      , [ReadsToTransfer].[Transferred] AS [Transferred]
      , [ReadsToTransfer].[Units] AS [Units]
      FROM [dbo].[ReadsToTransfer] AS [ReadsToTransfer])
    AS [Extent1]

这似乎是非常低效的,尤其是当表包含作为我们确实接近250万行。此外,如果我钉。取一(2000年)上的代码的结束时,它简单地把一个“选择顶部2000”仅在第一选择。因此,使得它选择内部选择它是整个表的顶部2000。

在此任何想法?

有帮助吗?

解决方案

  

这似乎是非常低效的

我不这么认为...外SELECT只是内部SELECT的突起(实际上是标识投影),以及一个突出部具有可忽略的性能影响...

关于TOP 2000条款,事实上,它是在外部SELECT并不意味着该DB将读取从内选择所有的行;只要它们是由外部SELECT请求它将读取它们,然后停止。

只是尝试手动运行该查询,使用或不使用外部SELECT:我敢打赌,你不会找到任何性能上的差异显著

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top