エンティティフレームワーク:クエリが理由もなく「から選択」を実行
-
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、外側の有無にかかわらず、手動でクエリを実行しよう
所属していません StackOverflow