Разница в производительности между LINQ и хранимыми процедурами

Связанные

LINQ-to-SQL и хранимые процедуры?

Я слышал много разговоров о преимуществах хранимых процедур, которые были предварительно скомпилированы. Но какова фактическая разница в производительности между LINQ и хранимыми процедурами на Selects, Inserts, Updates, Deletes? Кто-нибудь запускает какие-либо тесты вообще, чтобы увидеть, есть ли какая-либо существенная разница. Мне также интересно, имеет ли значение большее количество транзакций.

Я предполагаю, что операторы LINQ будут кэшироваться после первой транзакции, и производительность, вероятно, будет почти одинаковой. Мысли?

Ответ 1

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

Я думаю, что разница в том, что хороший разработчик SQL, который знает, как оптимизировать и использует хранимые процедуры, всегда будет иметь небольшое преимущество в производительности. Если вы не сильны в SQL, пусть Linq рассчитан на вас, и ваша производительность, скорее всего, будет приемлемой. Если вы сильный разработчик SQL, используйте хранимые процедуры, чтобы выжать немного дополнительной производительности, если это требует приложение.

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

Ответ 2

Запросы LINQ могут (и должны быть) предварительно скомпилированы. У меня нет никаких тестов, чтобы поделиться с вами, но я думаю, что всем следует читать эту статью для справки о том, как это сделать. Мне было бы особенно интересно увидеть некоторое сравнение предварительно скомпилированных запросов LINQ с SPROCS.

Ответ 3

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

Ответ 4

Запросы LINQ2SQL не будут выполняться иначе, чем любой другой запрограммированный SQL запрос SQL, кроме возможности того, что генератор не может оптимизировать запрос наилучшим образом.

Ответ 5

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

Сохраненная процедура - лучший способ для написания сложных запросов по сравнению с LINQ.

Ответ 6

Общепринятое мнение заключается в том, что запросы ad-hoc sql лучше, чем хранимые процедуры. Однако это неверно:

SQL Server 2000 и версия SQL Server 7.0 содержат ряд изменений в обработке операторов, которые расширяют многие эффективности использования сохраненных процедуры для всех операторов SQL. SQL Сервер 2000 и SQL Server 7.0 не сохранить частично скомпилированный план для хранимые процедуры, когда они создано. Хранимая процедура скомпилированные во время выполнения, как и любые другой инструкции Transact-SQL. SQL Сервер 2000 и SQL Server 7.0 сохраняют планы выполнения для всех операторов SQL в кеше процедур, а не только планы выполнения хранимых процедур.

- SqlServer Books Online

Учитывая вышеизложенное и тот факт, что LINQ генерирует специальные запросы, я пришел к выводу, что между хранимыми процедурами и LINQ нет разницы в производительности. И я также считаю, что SQL Server не будет двигаться назад с точки зрения производительности запросов.

Ответ 7

Linq следует использовать на уровне бизнес-логики поверх представлений, созданных в sql или oracle. Linq помогает вам вставить еще один слой для бизнес-логики, обслуживание которого находится в руках кодеров или не-sql-парней. Он, безусловно, не будет работать так же хорошо, как sql coz, его не прекомпилировать, и вы можете выполнять множество разных вещей в sps. Но вы можете определенно добавить детали программирования и отделить бизнес-логику от основных sql-таблиц и объектов базы данных с помощью Linq.

Ответ 9

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

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

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

Вы можете найти это сравнение различных способов взаимодействия .NET 3.5 с базой данных. http://toomanylayers.blogspot.com/2009/01/entity-framework-and-linq-to-sql.html

Ответ 10

Я не думаю, что хотел бы иметь свой уровень базы данных в скомпилированном коде. Он должен быть отдельным слоем, не объединенным. Когда я разрабатываю и использую Agile, я постоянно меняю дизайн базы данных, и процесс идет очень быстро. Добавление столбцов, удаление столбцов или создание новых таблиц на SQL Server так же просто, как ввод в Excel. Нормализация таблицы или де-нормализация также довольно быстро на уровне базы данных. Теперь с Linq мне также пришлось бы менять представление объекта каждый раз, когда я вношу изменения в базу данных или живу с ним, не отражая, как данные хранятся. Это много дополнительной работы.

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

А как насчет преимущества настройки View или сохраненной процедуры. Вы можете сделать это непосредственно на уровне базы данных, не перекомпилируя код и не выпуская его на производство. Если у меня есть представление, в котором отображаются данные из нескольких таблиц, и я решил изменить дизайн базы данных, все, что мне нужно сделать, это изменить этот вид. Весь мой код остается тем же.

Ответ 11

<script>alert("hello") </script> Я думаю, что делать это на веб-сервере (будь то в LINQ или ad-hoc SQL) будет быстрее или эффективнее, чем позволить SQL Server делать это в базе данных?

Для простых запросов LINQ, очевидно, лучше, поскольку он будет предварительно скомпилирован, что даст вам преимущество в том, что у вас есть проверка типов и т.д. Однако для любых интенсивных операций с базой данных, для создания отчетов, анализа объемных данных, которые необходимо выполнить, сохраняется процедуры выиграют руки dow

Ответ 12

Рассмотрим таблицу базы данных с миллионом записей, соединенную с другой таблицей с миллионом записей... вы честно думаете, что делать это на веб-сервере (будь то в LINQ или ad-hoc SQL) будет быстрее или более эффективно, чем позволить SQL Server делать это в базе данных?

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