Entity Framework: запрос выполняет «выбор из» без причины - PullRequest
3 голосов
/ 11 февраля 2010

У меня есть некоторые проблемы со структурой сущностей. Я выполняю простой выбор из представления в базе данных. Однако когда я просматриваю SQL, который генерирует EF, он выполняет запрос дважды, используя select from. Это так, как это должно работать? Это кажется очень неэффективным.

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 внутреннего выбора, который является всей таблицей.

Есть мысли по этому поводу?

1 Ответ

2 голосов
/ 11 февраля 2010

Это кажется очень неэффективным

Я так не думаю ... внешний SELECT - это просто проекция (фактически проекция идентичности) внутреннего SELECT, и проекция оказывает незначительное влияние на производительность ...

Что касается предложения TOP 2000, то, что оно находится во внешнем SELECT, не означает, что БД будет читать все строки из внутреннего SELECT; он будет читать их, пока они запрашиваются внешним SELECT, а затем останавливаться.

Просто попробуйте выполнить запрос вручную, с или без внешнего SELECT: держу пари, что вы не найдете существенного различия в производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...