2009-10-15 1 views
1

В прошлом при работе с базами данных я обнаружил, что необходимо выполнить низкоуровневые настройки для запроса, например, дать подсказки оптимизатору, что он должен использовать определенный индекс или присоединиться заказ. В настоящее время мы рассматриваем возможность перезаписи уровня данных с помощью Entity Framework; это то, что использование EF предотвращает подобную оптимизацию на низком уровне?Низкоуровневая оптимизация SQL с Entity Framework

В ответ на вопрос this question было предложено, чтобы переработка запроса LINQ была наилучшим способом обеспечения эффективности запроса к базовой базе данных, но, безусловно, это противоречит заявленной цели платформы Entity Framework, согласно которой она должна отделять физические -слойные проблемы из кода, которые должны иметь дело только с концептуальным слоем.

Один из вариантов - использовать представление. Другой вариант, по-видимому, заключается в настройке определяющего запроса для типа сущности. Тем не менее, оба этих подхода работают с одним сущностью, и оптимизационные твики часто необходимо применять только для некоторых видов использования таблицы, а не для каждого использования таблицы. Меня волнует, что я собираюсь в конечном итоге ввести псевдоучреждения в концептуальный слой, чтобы воспользоваться этим, опять же отвлекаясь от разделения концептуальных и физических слоев.

+0

Для записи, мы используем MySQL, а не SQL Server. Я не могу прокомментировать его оптимизатор, но в случае с MySQL существует множество мест, где он выбирает субоптимальный план выполнения. Стандартный аргумент о микро-оптимизации в коде заключается в том, что оптимизаторы компилятора стали настолько умными, что вы не можете их победить. Аналогичный случай с оптимизаторами SQL, похоже, очень далек от моего опыта. –

ответ

1

Ну, так как я написал ответ, на который вы ссылаетесь, возможно, я должен уточнить. Запросы LINQ, которые плохо написаны как LINQ, должны быть переписаны, потому что плохой LINQ редко становится хорошим SQL. Поэтому напишите лучший LINQ, который вы можете, а не потому, что пытаетесь настроить SQL как таковой, но потому что вам нужно начать с чего-то, что хорошо на своих условиях.

Помимо этого, если вам нужно оптимизировать конкретный запрос, то вы, вероятно, захотите сопоставить хранимую процедуру. Помимо того, что вы получаете полный контроль, это позволяет делать то, что обычно не поддерживается в какой-либо реализации LINQ.

+0

Я не собирался критиковать ваш предыдущий ответ, который был совершенно уместным в контексте. Но, спасибо за разъяснение, я, безусловно, вижу смысл в написании правильного идиоматического LINQ как само собой разумеющееся, а не как преждевременная оптимизация. –

1

Я не являюсь экспертом по платформе Entity Framework, поэтому я уверен, что есть некоторые его части, которые я неправильно понимаю, но я знаю, что одна из причин, по которым любые администраторы баз данных SQL Server «неохотно» поддерживают ORM в целом, что эта проблема низкоуровневой настройки кода для производительности не была разумно решена. Общая вибрация, которую я получаю от некоторых сторонников EF, заключается в том, что SQL Server Opimization Engine улучшается с каждой версией, поэтому такое низкоуровневое кодирование не должно быть необходимым для большинства приложений.

При этом, если вам нужна высокопроизводительная работа с SQL Server, и вы не можете позволить себе модернизацию машины, я боюсь, вам нужно будет продолжать управлять своим кодом SQL (возможно, вы можете использовать LINQ to SQL); если приложение малое, а потребность в производительности снижается из-за объема хранимых данных, вы, вероятно, можете использовать EF и полагаться на оптимизатор.

0

Несмотря на то, что компилятор будет оптимизировать ваш код, если вы будете писать циклы, в циклах, в циклах он будет медленным.

Если вы загружаете вспомогательные таблицы с помощью «Inculde» или «load», вы получите различное количество обращений к базе данных.

Способ записи ваших запросов LINQ будет влиять на SQL, который производится.

Способ, которым я это делаю, - проверить sql, который производится, просмотрев вывод в профилировщике SQL.

Мы могли бы получить, где вы хотите быть, когда у нас есть в базах данных памяти :)