Подтвердить что ты не робот

Хранимые процедуры Framework Entity Framework против генерируемого SQL

Я использовал структуру сущности в нескольких проектах. В каждом проекте я использовал хранимые процедуры, сопоставленные с объектами, из-за известных преимуществ хранимых процедур - безопасности, ремонтопригодности и т.д. Однако 99% хранимых процедур являются основными хранимыми процедурами CRUD. Похоже, что это отрицает одну из основных функций экономии времени в Entity Framework - генерации SQL.

Я прочитал некоторые аргументы в отношении хранимых процедур или сгенерированного SQL из Entity Framework. Хотя использование CRUD SP лучше для безопасности, а SQL, сгенерированный EF, часто более сложный, чем необходимо, действительно ли он покупает что-либо с точки зрения производительности или удобства использования SP?

Вот что я считаю:

  • В большинстве случаев, изменение SP требует обновления модели данных так или иначе. Таким образом, он не покупает много с точки зрения ремонтопригодности.
  • Для веб-приложений подключение к базе данных использует один идентификатор пользователя, специфичный для приложения. Таким образом, пользователи даже не имеют прямого доступа к базе данных. Это снижает безопасность.
  • Для небольшого приложения несколько снизилась производительность при использовании сгенерированный SQL, вероятно, не будет большой проблемой. Для высоких объем, производительность критически важных приложений, EF даже быть мудрым выбор? Кроме того, выступили инструкции insert/update/delete EF действительно так плохо?
  • Отправка каждого атрибута в хранимую процедуру имеет свои собственные штрафы за производительность, тогда как код сгенерированный EF отправляет только те атрибуты, которые были фактически изменены. При обновлении больших таблиц увеличенный сетевой трафик и накладные расходы на обновление всех атрибутов, вероятно, отрицают преимущества производительности хранимых процедур.

С учетом сказанного, мои конкретные вопросы:

Правильно ли верны мои убеждения? Является ли идея всегда использовать SPs что-то, что является "старой школой", когда ORM набирают популярность? В своем опыте, который лучше всего подходит для EF-сопоставления SP для всех вложений/обновлений/удалений или с использованием EF-генерируемых SQL-операций для CRUD и только с использованием SP для более сложных материалов?

4b9b3361

Ответ 1

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

Все мои основные операции CRUD - это прямой код сгенерированный EF - у моих веб-приложений было 100 или более SP, теперь у типичного будет дюжина SP, а все остальное сделано в моем коде на С#.... и моем производительность снизилась, устраняя эти 95% хранимых процедур CRUD.

Ответ 2

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

  • База данных следует строгим правилам безопасности, когда изменение данных разрешено только через хранимые процедуры.
  • Вы используете представления или пользовательские запросы для сопоставления ваших сущностей, и вам нужна расширенная логика в хранимой процедуре для возврата данных.
  • У вас есть некоторая расширенная логика (связанная с данными) в процедуре по любой другой причине.

Использование процедур для чистого CUD, где применяется не упомянутых случаев, является избыточным и не обеспечивает какого-либо измеримого повышения производительности, за исключением одиночного сценария

  • Вы будете использовать хранимые процедуры для пакетных/массовых модификаций

EF не имеет объемной/пакетной функциональности, поэтому изменение 1000 записей приводит к 1000 обновлениям, каждый из которых выполняется с помощью отдельной базы данных roundtrip! Но такие процедуры не могут быть сопоставлены сущностям в любом случае и должны выполняться отдельно через импорт функции (если возможно) или непосредственно как ExecuteStoreCommand или старый ADO.NET(например, если вы хотите использовать параметр таблицы).

Вся разная история может быть R в CRUD, где хранимая процедура может получить значительный прирост производительности для чтения данных с вашими оптимизированными запросами.

Ответ 3

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

Из моего PoV EF - отличное повышение производительности разработчиков. Вы теряете справедливость в том, что, если вы пишете SP для простых операций CRUD, а для Insert/Update/Delete в частности, я действительно не вижу, что вы набираете большую часть производительности, потому что эти операции настолько просты в создании SQL for. Конечно, есть некоторые случаи выбора, в которых EF не будет делать оптимальную вещь, и вы можете получить значительное увеличение производительности путем написания SP (в качестве примера можно привести иерархические запросы с использованием CONNECT BY в Oracle).

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

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

Это интересный вопрос, который не имеет правильного правильного или неправильного ответа. Я использую EF в первую очередь, так что мне не нужно писать общие CRUD SP и вместо этого я могу потратить свое время на более сложные дела, поэтому для меня я бы сказал, что вы должны написать меньше.:)

Ответ 4

Я согласен в целом с E.J, но есть пара других вариантов. Это действительно сводится к требованиям для конкретной системы:

  • Вам нужно, чтобы приложение было разработано FAST? - Затем используйте инфраструктуру сущности и ее автоматический SQL
  • Нужна мелкозернистая и надежная безопасность? - Перейдите на хранимые процедуры.
  • Нужно ли ему работать как можно быстрее? - Вы, вероятно, смотрите на счастливую среду!

Ответ 5

По-моему, пока ваше приложение/база данных не пострадает от проблем с производительностью, и вы в основном используете базу данных для CRUD и получаете доступ к ней, используя только одного пользователя БД, лучше использовать сгенерированный SQL. Он быстрее развивается, становится более ремонтопригодным, и некоторые преимущества безопасности или более конфиденциальности не стоят (если данные не так чувствительны). Также использование доступа к базе данных на основе модели или LINQ отключило угрозу от SQL-инъекций.