Какой из этих двух SQL-запросов более эффективен? - PullRequest
0 голосов
/ 10 декабря 2010

Я использую Entity Framework и Linq to Entities с коннектором MySQL ADO.Net для доступа к базе данных MySQL.

Существует две таблицы «Запросы» и «Представления» с отношением «один ко многим» от «Запросы к представлениям».Соответственно, таблица Submissions содержит столбец RequestId, который зависит от внешнего ключа от Requests.

Мне нужно получить все запросы, в которых его представления содержат определенное значение.В LINQ я могу сделать это одним из двух способов:

var r1 = foo.Submissions.Where(s => s.FieldName == "foo" && s.FieldValue == "bar").Select(s => s.Request).Distinct();
var r2 = foo.Requests.Where(r => r.Submissions.Any(s => s.FieldName == "foo" && s.FieldValue == "bar"));

, который оценивается как

SELECT `Distinct1`.*
FROM
   (SELECT DISTINCT `Extent2`.*
    FROM `Submissions` AS `Extent1` INNER JOIN `Requests` AS `Extent2` ON `Extent1`.`RequestId` = `Extent2`.`RequestId`
    WHERE ("foo" = `Extent1`.`FieldName`) AND ("bar" = `Extent1`.`FieldValue`))
AS `Distinct1`

SELECT `Extent1`.*
FROM `Requests` AS `Extent1`
WHERE EXISTS
   (SELECT 1 AS `C1`
    FROM `Submissions` AS `Extent2`
    WHERE (`Extent1`.`RequestId` = `Extent2`.`RequestId`) AND ((@gp1 = `Extent2`.`FieldName`) AND (@gp2 = `Extent2`.`FieldValue`)))

Теперь первый стиль запроса использует INNER JOIN ... теперь он менее эффективенчем второй выбор?

Ответы [ 2 ]

3 голосов
/ 10 декабря 2010

Вы сможете определить это самостоятельно, посмотрев планы запросов, сгенерированные для обоих запросов в SSMS. Ищите специально для любых сканирований вместо поиска.

Затем вы можете проанализировать оба запроса в SQL Profiler, чтобы увидеть, который генерирует меньше общих чтений и потребляет меньше циклов ЦП.

0 голосов
/ 10 декабря 2010

Первый подход потенциально включает в себя сортировку (отдельную), которая предполагает, что альтернатива EXISTS будет работать лучше, когда количество отправлений для каждого запроса велико.

Что говорят вам настенные часы?

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