Выбор лучшего запроса из 2-х запросов, оба возвращающие одинаковые результаты - PullRequest
1 голос
/ 07 сентября 2011

У меня есть два разных sql-запроса, один из которых я написал, а другой автоматически сгенерирован C # при использовании с linq, оба дают одинаковые результаты.

Я не уверен, какой из них выбрать, Iam ищет

  1. Какой лучший способ выбрать один запрос из множества, когда все возвращают один и тот же результат (наиболее оптимизированный запрос).
  2. Из моих запросов (написано ниже), какой из них я должен выбрать.

Рукописная запись

select * from People P
inner join  SubscriptionItemXes S
on
P.Id=S.Person_Id
inner join FoodTagXFoods T1
on T1.FoodTagX_Id = S.Tag2

inner join FoodTagXFoods T2
on T2.FoodTagX_Id = S.Tag1

inner join Foods F
on
F.Id= T1.Food_Id and F.Id= T2.Food_Id

where p.id='1'

Автоматически сгенерировано LINQ

SELECT 
[Distinct1].[Id] AS [Id], 
[Distinct1].[Item] AS [Item]
FROM ( SELECT DISTINCT 
    [Extent2].[Id] AS [Id], 
    [Extent2].[Item] AS [Item]
    FROM    [dbo].[People] AS [Extent1]
    CROSS JOIN [dbo].[Foods] AS [Extent2]
    INNER JOIN [dbo].[FoodTagXFoods] AS [Extent3] 
    ON [Extent2].[Id] = [Extent3].[Food_Id]
    INNER JOIN [dbo].[SubscriptionItemXes] AS [Extent4] 
    ON [Extent1].[Id] = [Extent4].[Person_Id]
    WHERE (N'rusi' = [Extent1].[Name]) AND ( EXISTS (SELECT 
        1 AS [C1]
        FROM [dbo].[FoodTagXFoods] AS [Extent5]
        WHERE ([Extent2].[Id] = [Extent5].[Food_Id]) 
            AND ([Extent5].[FoodTagX_Id] = [Extent4].[Tag1])
    )) AND ( EXISTS (SELECT 
        1 AS [C1]
        FROM [dbo].[FoodTagXFoods] AS [Extent6]
        WHERE ([Extent2].[Id] = [Extent6].[Food_Id]) 
            AND ([Extent6].[FoodTagX_Id] = [Extent4].[Tag2])
    ))
)  AS [Distinct1]

Результаты плана выполнения

Рукописные: Стоимость запроса (относительно партии): 33%

Сгенерированный Linq: Стоимость запроса (относительно партии): 67%

Ответы [ 3 ]

6 голосов
/ 07 сентября 2011

Я обнаружил, что два разных запроса, один рукописный и один, сгенерированный Linq, могут выглядеть совершенно по-разному, но на самом деле, когда вы анализируете план запроса в SSMS, вы обнаруживаете, что на самом деле они почти идентичны.

Вам необходимо выполнить эти запросы в SSMS с включенным Display Actual Execution Plan и проанализировать различные планы. Это единственный способ правильно проанализировать два и выяснить, что лучше.

В целом, Linq на самом деле очень хорошо генерирует эффективные запросы; даже если сам SQL довольно уродлив (в некоторых случаях это тот тип SQL, который написал бы человек, если бы у него было время!). Если, конечно, это сказало, это может также произвести некоторых свиней!

Кроме того, обращение к SO за помощью в выполнении запроса по стольким таблицам чревато для нас проблемами, поскольку оно будет в значительной степени зависеть от ваших индексов:)

3 голосов
/ 07 сентября 2011

Но они не совсем возвращают одно и то же ... Первый запрос захватывает все (SELECT *), пока LINQ собирается извлечь то, что вам действительно нужно (id и item).Вы можете сказать, что это тривиально, но потоковая передача большого количества данных, которые никогда не использовались, является пустой тратой пропускной способности и сделает ваше приложение медленным.Кроме того, кажется, что запрос LINQ делает намного больше, что может или не может быть правильным решением, особенно если данные заполнены в FoodTagXFoods

Что касается того, что работает лучше, я не могу сказать вам без чего-то вродефактические планы запросов и / или результаты статистики по обоим запросам.Мои деньги написаны от руки, но, может быть, потому, что мне нравятся мои руки.

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