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

Почему параметризованный SQL, сгенерированный NHibernate, так же быстро, как хранимая процедура?

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

4b9b3361

Ответ 2

Раунд 1 - Вы можете запустить трассировку профилировщика и сравнить время выполнения.

Ответ 3

Для большинства людей лучший способ убедить их - "показать им доказательство". В этом случае я бы создал пару базовых тестовых примеров для получения одного и того же набора данных, а затем время, необходимое для использования хранимых процедур в сравнении с NHibernate. Когда у вас есть результаты, передайте их им, и большинство скептически настроенных людей должны уступить доказательствам.

Ответ 4

Я бы добавил только пару вещей, на которые ответил Роб:

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

Во-вторых, сделайте все остальное равным, за исключением использования генерируемого запроса nHibernate и вызова s'proc. Надеюсь, вы можете выполнить тест, просто заменив поставщика.

Наконец, поймите, что на кону обычно гораздо больше, чем просто хранимых процедур против ORM. Имея это в виду, тест должен учитывать все факторы: время выполнения, потребление памяти, масштабируемость, возможность отладки и т.д.

Ответ 6

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

Лучшим аргументом для использования хранимых процедур является безопасность. Если вы используете только хранимые процедуры без динамического sql, вы можете отключить разрешения SELECT, INSERT, UPDATE, DELETE, ALTER и CREATE для пользователя базы данных приложения. Это защитит вас от SQL Injection второго порядка, тогда как параметризованные запросы эффективны только для инъекций первого порядка.

Ответ 7

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

Ответ 8

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

Ответ 9

Это так же быстро, если запрос один и тот же раз. Sql Server 2005 кэширует планы запросов на уровне каждого оператора в пакете, независимо от того, откуда приходит SQL.

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

Ответ 10

У меня был этот аргумент много раз.
Почти всегда я заканчиваю тем, что хватаю действительно хорошую dba, и запускаю proc и кусок кода с запуском профайлера и получаю dba, чтобы показать, что результаты настолько близки к его незначительности.

Ответ 11

Измерьте это.

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

Ответ 12

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

Ответ 13

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

Насколько медленным, если его даже измеримым, является спорным. Этому также способствует тот факт, что большинство ORM имеют механизм кэширования, чтобы вообще не выполнять запрос.

Ответ 14

Даже если хранимая процедура на 10% быстрее (это, вероятно, нет), вы можете спросить себя, насколько это действительно важно. Что действительно важно в конце концов, так это то, как легко писать и поддерживать код для вашей системы. Если вы кодируете веб-приложение, а ваши страницы возвращаются через 0,25 секунды, дополнительное время, сохраненное с помощью хранимых процедур, незначительно. Тем не менее, может быть много дополнительных преимуществ использования ORM, например, NHibernate, который было бы чрезвычайно сложно дублировать, используя только хранимые процедуры.