2012-06-11 4 views
0

У меня есть простой запрос структуры объекта. Он использует группировку:Эффективные планы запросов и выполнения

source.GroupBy(x => x.Key) 
.Select(x => x.Count(z => z.IsDefaultValue == false) > 0 
    ? x.FirstOrDefault(z => z.IsDefaultValue == false) 
    : x.FirstOrDefault() 
); 

план выполнения для него выглядит следующим образом:

Plan 1

Тогда я изменить запрос:

source.GroupBy(x => x.Key) 
.Select(x => x.Any(z => z.IsDefaultValue == false) 
    ? x.FirstOrDefault(z => z.IsDefaultValue == false) 
    : x.FirstOrDefault() 
); 

Сейчас я использую Любой вместо Количество. Планируется, что это: Plan 2

Мой вопрос: какой запрос использовать? Какой запрос более эффективен?

Я ничего о планах выполнения :( не понимаю, что важной информации, вы видите на этих планах выполнения

EDIT: Пожалуйста, перетащить фотографии в новой вкладке, это будет более удобным для чтения

.
+0

Нельзя сказать многого из изображения. Нужен фактический план выполнения XML. В нижнем случае число операторов сканирования удваивается и выглядит так, как если бы SQL Server стоил его как более дорогостоящий (на основе того факта, что сортировка после кластеризованного сканирования CI будет постоянной стоимостью и составляет 30% от стоимости первая и 18% второй). Похоже, что вам, вероятно, не хватает полезных индексов, если таблицы не очень малы. –

+0

Как насчет EF's Any() vs Count()> 0? Что более эффективно?Извините, я не хочу делиться планом выполнения XML - он большой и уродливый. –

ответ

1

Мой вопрос:?, что запрос я должен использовать Какой запрос является более эффективным

Чтобы найти ответ на этот вопрос, я бы просто взять бота h SQL-запросов, которые были сгенерированы (вы можете увидеть полный запрос в XML-плане) и запустить их в одном окне запроса SQL Server Management Studio вместе с опцией «Включить фактический план выполнения».

«Стоимость запроса (относительно партии)» в результирующем плане сообщит вам, какая из них более эффективна для вашей фактической схемы/данных.

Что относительно EF's Any() vs Count()> 0? Что более эффективно?

В общем, если вы просто хотите знать, если любой из «вещей» соответствуют вашим критериям, то это часто предполагается использовать любой() вместо Count()> 0 и пусть LINQ беспокоиться о построении наиболее эффективным способом. В этом случае я бы просто проверил SQL и посмотрел.

См ответы, как this

Для только IEnumerable<T>, то Any() будет обычно быть быстрее, так как он имеет только взглянуть на одну итерацию.

Смежные вопросы