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

List<String> strings=new ArrayList<String>(){};

while(strings.size() > 0) {

 String str = strings.remove(0);
}
15
задан Toran Billups 18 July 2012 в 15:53
поделиться

13 ответов

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

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

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

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

13
ответ дан 1 December 2019 в 01:17
поделиться

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

5
ответ дан 1 December 2019 в 01:17
поделиться

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

8
ответ дан 1 December 2019 в 01:17
поделиться

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

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

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

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

5
ответ дан 1 December 2019 в 01:17
поделиться

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

А лучшим аргументом для использования хранимых процедур является безопасность. Если Вы используете только хранимые процедуры, с никакой динамический sql, можно отключить ВЫБОР, ВСТАВИТЬ, ОБНОВИТЬ, УДАЛИТЬ, ИЗМЕНИТЬ и СОЗДАТЬ полномочия для пользователя базы данных приложения. Это защитит Вас от большей части 2-го порядка Внедрение SQL, тогда как параметризированные запросы являются только эффективными против инжекции первого порядка.

2
ответ дан 1 December 2019 в 01:17
поделиться

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

1
ответ дан 1 December 2019 в 01:17
поделиться

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

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

1
ответ дан 1 December 2019 в 01:17
поделиться

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

1
ответ дан 1 December 2019 в 01:17
поделиться

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

1
ответ дан 1 December 2019 в 01:17
поделиться

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

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

0
ответ дан 1 December 2019 в 01:17
поделиться

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

0
ответ дан 1 December 2019 в 01:17
поделиться

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

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

0
ответ дан 1 December 2019 в 01:17
поделиться

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

0
ответ дан 1 December 2019 в 01:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: