Я слушаю подкаст Hanselminutes; «StackOverflow использует ASP.NET MVC - Джефф Этвуд и его техническая команда». В ходе подкаста они говорят о сервере SQL и говорят что-то вроде «Дни хранимой процедуры прошли».
Сейчас я не администратор баз данных, но это меня немного удивило. Я всегда предполагал, что SP - это путь к скорости (поскольку они соблюдаются) и безопасности, не говоря уже о масштабируемости и ремонтопригодности. Если это не так и ИП находятся на последнем издыхании, что их заменит или что нам следует делать в будущем?
Ссылка на подкаст: hanselman.com/blog/…





В современных системах параметризованные запросы компилируются и кэшируются на сервере, поэтому они работают так же быстро, как хранимая процедура. У них также есть большинство тех же функций безопасности.
Для баз данных, обслуживающих одно приложение, имеет смысл иметь логику запроса в соответствующем месте кода. По крайней мере, это упрощает контроль версий. Если вы храните хранимые процедуры на сервере, их отслеживание может быстро превратиться в беспорядок. Вдобавок, если вы используете ORM-инструмент, у вас в любом случае не так уж много возможностей для реального SQL.
Если ваша база данных обслуживает несколько разных приложений, вы все равно можете использовать хранимые процедуры для обеспечения соблюдения бизнес-правил между приложениями.
Согласованные SP - это благо, когда у вас есть несколько приложений на нескольких языках (поэтому вы не можете совместно использовать код между ними).
но кто пишет систему, в которой хранимые процедуры только выполняют запросы? что вы делаете для обновлений - или обновляете побочные эффекты (без триггеров, которые, конечно, все еще отстой ;-))
«запросы» также относятся к вставке, обновлению и удалению и т. д.
Если ваша база данных обслуживает несколько приложений, вам, вероятно, понадобится уровень службы (WS / REST).
@ [maud-dib.blogspot.com]: не имеет значения, если бы база данных обслуживала только одно приложение, обновления одной таблицы каскадно переходят в обновления других таблиц; поскольку триггеры в целом отстой, хранимые процедуры вызывают друг друга. Для "простой" БД подойдет parm.queries, как и тривиальный уровень WS ...
В современной системе специальные и динамические запросы также кэшируются и компилируются.
Как бы то ни было, именно база данных должна обеспечивать соблюдение бизнес-правил в приложениях.
@Cumbayah - Уровень обслуживания, вероятно, более уместен, но не все хотят это делать.
SP, вероятно, лучший вариант, если вас волнует ТОЛЬКО скорость. Но если вы заботитесь о масштабируемости или ремонтопригодности, SP могут быть не лучшими. Наша архитектура построена на SP, и после 10 лет написания кода ее очень сложно поддерживать и она содержит много ошибок. Хороший картограф ORM может быть лучшим выбором.
То, что SP не работают для вас, не означает, что они не могут работать. SP можно сделать правильно, ORM можно сделать неправильно
Я бы сказал, что SP не обслуживаются и не масштабируются. Спросите любого разработчика, которому приходилось добавлять функциональность в тяжелую систему SP. Почему половина вашей логики находится на другом уровне? Заменить нечем, просто не используйте их.
как вы оправдываете это первое предложение? я бы сказал, что любой код можно масштабировать и поддерживать его в значительной степени так же, как и любой другой код.
Мой опыт. Может быть, мне следует сказать: «Мне сложно поддерживать SP, особенно при большом количестве разработчиков на разных континентах». Если вся система состоит из поставщиков услуг, это одно. Я не видел таких систем.
Я не уверен, что этот пост был таким классным. Этот парень также был против использования ограничений базы данных (таких как внешние ключи). Я думаю, что он также возражал против использования первичного ключа или уникальных ограничений на уровне базы данных. Мне это кажется совершенно безумным.
В сообщении Тони Марстона нет слов «первичный» или «уникальный», так что спешите делать собственные выводы.
ORM и LINQ to SQL кажутся текущими тенденциями замены StoredProcs.
Я лично использовал ORM, и мне было намного проще поддерживать и поддерживать его.
Некоторые из причин, указанных для использования сохраненных процедур, никогда не имели законных оснований.
Вы действительно хорошо понимаете, что хранимые процедуры используются при обслуживании нескольких приложений; по сути, они становятся DAL, обычно с некоторой бизнес-логикой.
Видите ли, вот такие вещи меня действительно смущают ... Посмотрите резюме. theserverside.net/news/thread.tss?thread_id=31953
Но до тех пор, пока ORM и LINQ не будут поддерживаться для всех языков, мы по-прежнему будем использовать SP (хотя я хочу, чтобы LINQ распространялся быстрее!)
Эта статья на сервере (опять же) упускает суть, как и многие другие. Люди, которые выступают против хранимых процедур (в большинстве, но не во всех ситуациях), не защищают перенос sql из хранимых процедур в DAL. Они выступают за удаление sql всех вместе! Как это не может быть более ремонтопригодным.
Крейг, не могли бы вы объяснить, что вы имеете в виду, говоря: «Они выступают за удаление sql сразу. Я тоже могу упустить суть.
Если вы используете ORM, например nHibernate, SQL автоматически генерируется фреймворком за кулисами. От разработчика не требуется писать какой-либо SQL, если он не хочет. На моем сайте www.jobtree.com.au я написал только SQL для некоторых ночных пакетных процессов.
Проблема с ORM, например Hibernate, заключается в том, что вам нужно использовать спящий режим для доступа к данным и обновлений.
может быть, я слишком старомоден, или слишком ленив, или и то, и другое, но я должен не согласиться. Снова и снова хранимые процедуры «спасают положение», потому что, когда появляется незначительное внутреннее изменение или ошибка, нам нужно только исправить хранимую процедуру вместо обновления настольного приложения на нескольких десятках рабочих столов плюс веб-сервер. Кроме того, пользователи не прерываются. Это экономит много усилий и избавляет пользователя от лишних хлопот.
Кроме того, некоторые операции с БД будут более эффективными на сервере, а не взад-вперед по сети, особенно. когда одна хранимая процедура вызывает другую, которая вызывает другую и т. д. (с курсорами или без них)
Обновлено: в архитектуре SOA проблема обновления клиентских приложений смягчается (спасибо maud-dib), но хранимые процедуры, вызывающие друг друга, по-прежнему более эффективны, чем несколько сетевых циклов на уровне SOA. И обновление уровня SOA тоже не всегда тривиально.
Я согласен, это все еще верно для любого распределенного приложения. Я считаю, что это не так важно, как когда-то для серверных приложений, поскольку перекомпилированная DLL, сброшенная на сервер приложений, выполняет ту же функцию.
Эти приложения не должны подключаться к БД. Они должны подключаться к сервисному уровню.
LOL - я бы согласился, за исключением того, что (а) некоторые из этих приложений старше, чем SOA, (б) некоторые из этих приложений работают в реальном времени, (в) SOA просто решает проблему, поскольку исходное утверждение заключалось в том, что хранимые процедуры " устаревший"
«Приложения не должны подключаться к базе данных. Они должны подключаться к приложению уровня служб».
@ [anonymousstackoverflowuser]: ага, верно. см. выше. потому что в наши дни абсолютно все требует как минимум трех уровней, включая устаревшие системы. нет. ;-)
Это также зависит от того, что делают ваши хранимые процедуры.
Например, если это просто
select a from b where x = y
тогда хранимая процедура, вероятно, избыточна. Но я лично склонен использовать хранимые процедуры для возврата нескольких наборов результатов и результатов страниц в базе данных.
В своих случаях я вижу в их использовании пользу. Это дополнительный уровень, с которым нужно иметь дело, но если ваш код хорошо организован и логичен, я лично не вижу особых проблем.
Хороший проект с хранимыми процедурами всегда будет лучше, чем плохой проект без них, и наоборот.
Просто кидаю сюда свой маленький совет. До SQL 2005 (может быть, даже дальше) SP были быстрее. Однако SQL Server 2005 и более поздние версии действительно оптимизированы и кэшируют ваши запросы по мере их использования. Фактически, мы перенесли веб-приложение на новый SQL-сервер. Приложение запускалось медленным для всех. Все запускалось «3/4 секунды» или 1 секунду. Затем SQL начал компилировать наиболее часто используемый запрос, и все пошло от медленного до очень быстрого.
Конечно, мы поменяли местами сервер, когда на нем работало много людей (что может объяснить, почему сначала он был медленным). Но поверьте мне. СП еще не закончились. У них просто есть другое применение, кроме привязки к приложению.
Начиная с SQL Server 7 запросы кэшируются.
Этот вопрос также перетекает в один опубликован ранее сегодня.
Когда вы объединяете SP с логикой с самой базой данных, вы эффективно конвертируете БД во что-то вроде сервера приложений.
В те времена, когда это был самый удобный молоток, это имело смысл. Но теперь, когда серверы приложений доступны повсеместно, имеет смысл использовать их для таких вещей, как централизованная логика и бизнес-правила, и полагаться на БД только для обеспечения устойчивости.
Судя по невысокой производительности этого сайта, я готов поспорить, что основным узким местом является база данных.
Я никоим образом не уверен, что LINQ 2 SQL ORM, который они используют, на один бит быстрее, чем sproc.
SP обычно используются слишком рано в процессе разработки. Их следует использовать, когда у вас есть sql-оператор бутылочного горлышка. Например, вам, вероятно, не понадобится SP для удаления или создания пользователей для приложения. Для большинства компаний это должно быть довольно статичным.
Точно. SP - это не зло, которое никогда не должно создаваться (многие пользователи, не использующие ORM, похоже, думают, что мы так думаем). Сверхсложный запрос, который является обычным узким местом в приложении, отлично подходит для хранимых процессов.
если под «запросом» вы имеете в виду «набор операторов T-SQL», то я должен согласиться. Но если вы буквально имеете в виду «запрос», то есть один SELECT, тогда я не согласен. В качестве простого / глупого примера удаление пользователя для приложения может привести к каскадному удалению каждой записи, которую пользователь когда-либо создавал, в нескольких таблицах ...
Почему нельзя использовать для удаления пользователя? Для удаления пользователя необходимо выполнить множество запросов (взлом FK, удаление зависимых объектов, где это необходимо). Я пишу SQL один раз, а затем вставляю его в SP. Теперь это обычная рутина. Мой "бизнес-уровень" может называть это или копировать / вставлять.
Я все время слышу аргумент, что SP хороши, если у вас есть несколько приложений, подключающихся к базе данных, или что это упрощает исправление ошибок.
ЭТО ДЛЯ ЧЕГО ПРЕДНАЗНАЧЕН СЛОЙ СЛУЖБЫ!
Бизнес-логика находится на уровне обслуживания, логика приложения - в приложении / веб-сайте.
Намного сложнее отлаживать и поддерживать сотни SP (особенно если они сгенерированы), чем поддерживать хорошо написанный код, который общается с БД через инструмент ORM.
Мне нравятся инструменты ORM, они ускоряют разработку, но они не заменяют sprocs для сложных обновлений. Вероятно, вы обнаружите - через профилирование - что замена тяжелых обновлений ORM на sproc значительно повысит производительность. Предполагая, что ваши операции с базами данных такие сложные, конечно ...
Я согласен, если вы обнаружите горлышко бутылки, и SP решит ее, тогда это будет допустимый вариант использования.
+1 за напоминание об использовании служебных слоев - и за то, что мы согласны ;-)
Единственная проблема с этим - в некоторых корпоративных ситуациях, когда могут быть различные приложения, обращающиеся к БД, все они работают на разных платформах, и заставить их все пройти через уровень обслуживания может быть сложно. Вы можете использовать подход SOA, но я думаю, что людям проще найти SP.
Это отдельный вопрос, но зачем писать два приложения, если можно написать одно? Разделив бизнес-логику в отдельное приложение, вы дали себе вдвое больше работы и половину производительности.
Ремонтопригодность Наверное ИП лучше. Если поддерживать сотни SP сложно, поддерживать их в компонентах бизнес-уровня еще сложнее.
Представление Кэширование запросов может обеспечивать производительность, близкую к SP. Но они не могут сравниться с производительностью SP в разных базах данных на разных платформах. Задержка в сети - еще одна проблема, которая вызывает беспокойство, хотя в настоящее время этот разрыв сокращается.
Отлаживать Вероятно, это довольно просто с SP, чем отладка бизнес-уровня + уровня базы данных вместе взятых.
Используя SP, может быть еще больше + ve точек.
Но, глядя на современную тенденцию в программировании, довольно «разумно» перейти на многоуровневую архитектуру по множеству бизнес-причин, чем придерживаться «старого» подхода, основанного на SP.
Хорошая система должна сочетать и то и другое. Вероятно, следуя принципу 80-20, 20 - ИП.
Может быть, хранимые процедуры Джеффа Этвуда знает будут существовать вечно и просто пытаются стимулировать размышления и дискуссии? Мне нравится думать, что он действительно хотел бы написать убедительное эссе под названием «Хранимые процедуры считаются вредными» :)
Какое-то хорошее мнение высказывают обе стороны (как бы), но никто не придал большого значения вопросам безопасности. Заключение всего взаимодействия с БД в SP означает, что вы можете заблокировать БД, чтобы можно было жестко контролировать любое взаимодействие с данными.
Если вы думаете об инкапсуляции, вы можете рассматривать БД как объект, а SP как методы и свойства, которые открывают функциональность объектов внешнему миру.
В некоторых более крупных средах разработки разработчики пользовательского интерфейса и бизнес-уровня не могут находиться рядом с БД. Они определяют свои требования, а отдельная группа предоставляет и взаимодействует через SP.
Есть несколько веских причин не использовать SP и несколько веских причин использовать только их - в зависимости от вашего приложения и вашей среды. Но будьте уверены, SP никуда не денутся в ближайшее время.
Могу добавить, что некоторую работу лучше выполнять на уровне БД. например Результаты кросс-таблицы в SQL 2005, Рекурсивные запросы.
Я согласен с тем, что некоторые простые вещи, такие как SELECT, INSERT, UPDATE, DELETE, могут быть выполнены с помощью ORM, Linq.
Итак, глупо говорить, что дни хранимых процедур прошли. Сколько людей действительно должны беспокоиться об изменении платформы БД (SQL на Mysql, Oracle)?
Частично это обусловлено доступностью нереляционных хранилищ данных. SP обычно подразумевают реляционную базу данных; ORM и Linq предлагают возможность создавать уровни абстракции, которые богаче, чем предлагает SQL, и иногда лучше соответствуют абстракциям, которые мы используем в других частях проекта (проблема «несоответствия импеданса»).
И это тоже можно считать функцией архитектуры. SP imho очень хорошо сочетаются с классическим табличным приложением и могут предоставить удобный способ построения уровня абстракции на уровне бизнес-объектов.
Они не так удобны, если ваше хранилище данных - xml или аналитическая база данных.
Ба!
ORM, SP, View, Magic Wands или что-то еще.
У каждого «инструмента» есть свое место в вашем поясе, используйте инструменты с умом.
Единственное, что «изменилось» (действительно улучшилось), это то, что некоторые ORM имеют уже встроенные хорошие инструменты кэширования, а MySql и Sql 2005+ могут обрабатывать динамическое или специальное кэширование планов запросов / выполнения.
Потенциальная потеря производительности из-за бросания всех видов динамического sql на ваш сервер db была несколько смягчена. Теперь просто обойтись без хранимых процедур. Сохраненные процессы никуда не денутся.
Хранимые процедуры / представления / функции по-прежнему являются хорошим «интерфейсом» для базы данных, если вы запускаете несколько корпоративных приложений, использующих одну и ту же базу данных.
Приложение №1 - вам необходимо добавить новую связь / поле или изменить значение столбца, допускающего значение NULL, на значение, отличное от NULL.
Приложение № 2-10 - Может использовать или не использовать этот объект базы данных
Первое, что я хочу сделать, это проверить зависимости объекта базы данных, чтобы определить, как он используется и сломаю ли я что-нибудь. Угадайте, что, если у вас есть куча внешних запросов VIA ORM / SQL, вы бы не имели представления о зависимостях.
Это единственный недостаток, который я обнаружил, имея прямой доступ к таблицам.
Для одного приложения, использующего одну базу данных, это действительно не проблема. Хотя вам все равно придется смотреть код приложения на наличие зависимостей в дополнение к базе данных.
Сохраненные процедуры полезны для таких вещей, которые являются нет CRUD - например, специализированной кросс-табличной логики, которая лучше всего выполняется в БД. Операции CRUD не должны использовать SP, если они не являются автоматически сгенерированными выходными данными инструмента ORM, такого как TableAdapters.
это был хороший подкаст. Публикуем это как комментарий, потому что это неуместно.