Лучше ли Linq или SQL-запрос для сложных вычислений и агрегирования? - PullRequest
0 голосов
/ 17 октября 2018

Мы должны создать и показать во время выполнения (asp.net mvc) некоторые сложные отчеты из данных таблиц Oracle с миллионами записей.Данные отчетов должны быть получены из группировок и небольших сложных вычислений.Так лучше ли для производительности и удобства сопровождения кода выполнять эти группировки и вычисления с помощью SQL-запроса (pl / sql) или с помощью linq?Спасибо за ваш разжигание ответа

1 Ответ

0 голосов
/ 18 октября 2018

Так что же лучше для производительности и удобства сопровождения кода, который выполняет эти группировки и вычисления с помощью sql-запроса (pl / sql) или через linq?

Это зависит от того, что вы подразумеваете подvia linq.Если вы имеете в виду, что извлекаете полную таблицу из локальной памяти, а затем используете операторы linq для извлечения желаемого результата, тогда, конечно, операторы SQL работают быстрее.

Однако, если вы имеете в виду, что используете Entity Framework,или что-то подобное, тогда ответ дать непросто.

Если вы используете Entity Framework (или какой-то клон), ваши таблицы будут представлены IQueryable<...> вместо IEnumerable<...>.IQueryable имеет Expression и Provider.Expression представляет запрос, который должен быть выполнен.Provider знает, какая система должна выполнить запрос (обычно это система управления базами данных) и как связаться с этой системой.Когда запрос должен быть выполнен, задача Provider состоит в том, чтобы перевести Expression на язык, который система знает (обычно что-то похожее на SQL), и выполнить SQL-запрос.

Существует два вида операторов LINQ IQueryable: те, которые возвращают IQueryable<...> чего-либо, и те, которые возвращают TResult.Те, которые возвращают IQueryable, изменяют только Expression.Это функции, которые используют отложенное выполнение.

Функции, которые не возвращают IQueryable, ToList(), FirstOrDefault(), Any(), Max() и т. Д. Внутренне они будут вызывать функции, которые будутGetEnumerator() (обычно через foreach), который приказывает Provider перевести Expression и выполнить запрос.

Вернуться к вашему вопросу

Итаккакой из них более эффективен, объектный каркас или SQL?Эффективность - это не только время выполнения запросов, это также время разработки / тестирования для первой версии и будущих изменений в программном обеспечении.

Если вы используете Entity-Framework (-clone),SQL-запросы, созданные из Expressions, довольно эффективны, в зависимости от производителя платформы.Если вы посмотрите на код, то иногда SQL-запрос не является оптимальным, хотя для улучшения большинства запросов вам придется быть довольно хорошим SQL-программистом.

Большое преимущество над использованием Entity Framework иLINQ-запросы над SQL-операторами состоят в том, что время разработки будет короче.Синтаксис операторов LINQ проверяется во время компиляции, а операторы SQL - во время выполнения.Сроки разработки и тестирования будут короче.

Легко использовать операторы LINQ, в то время как операторы SQL почти всегда должны быть написаны специально для запроса, который вы хотите выполнить.Операторы LINQ можно тестировать без базы данных на любой последовательности элементов, представляющих ваши таблицы.

My Advice

Для большинства запросов вы не заметите никакой разницы в выполнениивремя между запросом структуры объекта или запросом SQL.

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

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

Если вы поместили DbContext в надлежащий репозиторий, где вы скрываете варианты использования от их реализаций, пользователи вашего репозитория не заметят разницы.

...