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

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

Ответы [ 13 ]

13 голосов
/ 08 сентября 2008

Я бы начал с чтения этой статьи:

http://decipherinfosys.wordpress.com/2007/03/27/using-stored-procedures-vs-dynamic-sql-generated-by-orm/

Вот тест скорости между двумя:

http://www.blackwasp.co.uk/SpeedTestSqlSproc.aspx

8 голосов
/ 08 сентября 2008

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

5 голосов
/ 08 сентября 2008

Я бы добавил пару слов к ответу Роба:

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

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

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

5 голосов
/ 08 сентября 2008

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

2 голосов
/ 08 сентября 2008

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

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

1 голос
/ 08 сентября 2008

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

1 голос
/ 08 сентября 2008

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

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

1 голос
/ 08 сентября 2008

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

1 голос
/ 08 сентября 2008

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

0 голосов
/ 09 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...