エンティティフレームワーク:クエリが理由もなく「から選択」を実行

StackOverflow https://stackoverflow.com/questions/2241656

  •  19-09-2019
  •  | 
  •  

質問

私は、エンティティフレームワークといくつかの問題を抱えています。私は、データベース内のビューからの単純な選択を実行しています。私は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万行が含まれている場合は特に、非常に非効率的であると思われます。私は、コードの末尾に.Take(2000)タック場合にも、それは単に最初の選択で「トップ2000を選択する」を置きます。したがって、テーブル全体であるかを選択内側の上部2000が選択させる。

この上の任意の考え?

役に立ちましたか?

解決

  

非常に非効率的であると思われること

私はそう思わない...外側SELECTは、内部SELECTのちょうど突起(実際には同一の投影)であり、突起は無視パフォーマンスへの影響を持っています...

TOP 2000句に関しては、それは外側のSELECTの上にあるという事実は、DBは、内側のSELECTからすべての行を読み取ることを意味するものではありません。それは、その後停止し、限り、彼らは外SELECTによって要求されたとして、それらを読みます。

私はあなたがパフォーマンスの有意な差を見つけることができません賭け

:。

ただ、SELECT、外側の有無にかかわらず、手動でクエリを実行しよう

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top