LINQ-SQL по сравнению с хранимыми процедурами? [закрытый]

Попробуйте добавить изображения в папку ресурсов в проекте xamarin ios и переименуйте файл, например:

check_outline_500_active.png,

check_outline_500_active@2x.png,

check_outline_500_active@3x.png

, но при использовании кода: check_outline_500_active.png

187
задан Community 23 May 2017 в 01:55
поделиться

15 ответов

Некоторые преимущества LINQ по sprocs:

  1. Безопасность с точки зрения типов : Я думаю, что все мы понимаем это.
  2. Абстракция : Это особенно верно с LINQ-to-Entities. Эта абстракция также позволяет платформе добавлять дополнительные улучшения, которые можно легко использовать в своих интересах. PLINQ является примером добавляющей поддержки многопоточности LINQ. Изменения кода минимальны для добавления этой поддержки. Было бы НАМНОГО более трудно сделать этот код доступа к данным, который просто называет sprocs.
  3. поддержка Отладки : Я могу использовать любой отладчик.NET для отладки запросов. С sprocs Вы не можете легко отладить SQL, и тот опыт в основном связывается с Вашим поставщиком базы данных (SQL Server MS предоставляет запросу анализатор, но часто который не является достаточно).
  4. агностик Поставщика : работы LINQ с большим количеством баз данных и количеством поддерживаемых баз данных только увеличатся. Sprocs являются не всегда портативными между базами данных, или из-за переменного синтаксиса или из-за поддержки функции (если поддержка БД sprocs вообще).
  5. Развертывание : Другие уже упомянули это, но легче развернуть единственный блок, чем развернуть ряд sprocs. Это также соединяется с № 4.
  6. , Легче : Вы не должны изучать T-SQL, чтобы сделать доступ к данным, и при этом Вы не должны изучать API доступа к данным (например, ADO.NET) необходимый для вызова sprocs. Это связано с № 3 и № 4.

Некоторые недостатки LINQ по сравнению с sprocs:

  1. Сетевой трафик : sprocs должны только сериализировать sproc-имя и данные аргумента по проводу, в то время как LINQ отправляет весь запрос. Это может стать действительно плохим, если запросы очень сложны. Однако абстракция LINQ позволяет Microsoft улучшать это со временем.
  2. менее гибкий : Sprocs может в полной мере воспользоваться featureset базы данных. LINQ имеет тенденцию быть более универсальным в, он - поддержка. Это распространено в любом виде абстракции языка (например, C# по сравнению с ассемблером).
  3. Перекомпиляция : Если необходимо внести изменения в способ, которым Вы делаете доступ к данным, необходимо перекомпилировать, присвоить версию и повторно развернуть блок. Sprocs может иногда , позволяют DBA настраивать стандартную программу доступа к данным без потребности повторно развернуть что-либо.

безопасность и управляемость - что-то, о чем спорят люди также.

  1. безопасность : Например, можно защитить уязвимые данные путем ограничения доступа к таблицам непосредственно и поместить ACLs на sprocs. С LINQ, однако, можно все еще ограничить прямой доступ к таблицам и вместо этого поместить ACLs на обновляемые представления таблицы для достигания подобной цели (принимающий поддержку БД обновляемые представления).
  2. Управляемость : Используя представления также дает Вам преимущество защиты Вашего приложения, неразрывного от изменений схемы (как нормализация таблицы). Можно обновить представление, не требуя, чтобы код доступа к данным изменился.

я раньше был крупным sproc парнем, но я начинаю склоняться к LINQ как к лучшей альтернативе в целом. Если будут некоторые области, где sprocs ясно лучше, то я, вероятно, все еще запишу sproc, но получу доступ к нему с помощью LINQ.:)

191
ответ дан Chris Gillum 23 November 2019 в 05:44
поделиться
2
ответ дан Community 23 November 2019 в 05:44
поделиться

Я предполагаю, что Вы значите Linq Для Sql

Для любой команды CRUD, легко представить производительность хранимой процедуры по сравнению с любой технологией. В этом случае любое различие между этими двумя будет незначительно. Попытайтесь представить для 5 (простые типы) объект поля более чем 100 000 запросов Select, чтобы узнать, существует ли реальная разница.

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

3
ответ дан Jon Limjap 23 November 2019 в 05:44
поделиться

Кроме того, существует проблема возможных 2,0 откатов. Доверяйте мне, это произошло со мной пару раз, таким образом, я уверен, что это произошло с другими.

я также соглашаюсь, что абстракция является лучшей. Наряду с фактом, исходная цель ORM состоит в том, чтобы составить соответствие RDBMS приятно к понятиям OO. Однако, если все хорошо работало, прежде чем LINQ при необходимости отклониться немного от понятий OO тогда завинчивают их. Понятия и действительность не всегда соответствуют хорошо вместе. Нет никакой комнаты для воинственных зилотов в IT.

4
ответ дан DylanWoods 23 November 2019 в 05:44
поделиться

LINQ не запрещает использование хранимых процедур. Я использовал смешанный режим с LINQ-SQL и LINQ-storedproc. Лично, я рад, что не должен писать сохраненный procs.... pwet-tu.

5
ответ дан kenny 23 November 2019 в 05:44
поделиться

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

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

8
ответ дан lomaxx 23 November 2019 в 05:44
поделиться

LINQ определенно имеет свое место в специализированных базах данных и в предприятиях малого бизнеса.

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

10
ответ дан 23 November 2019 в 05:44
поделиться

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

12
ответ дан Mark Cidade 23 November 2019 в 05:44
поделиться

LINQ является новым и имеет свое место. LINQ не изобретен для замены хранимой процедуры.

Здесь я сфокусируюсь на некоторых мифах о производительности & CONS, только для "LINQ к SQL", конечно, я мог бы быть полностью неправым;-)

(1) Люди говорят, что LINQ statment может "кэшироваться" в SQL-сервере, таким образом, это не теряет производительность. Частично верный. "LINQ к SQL" на самом деле является временем выполнения, переводящим синтаксис LINQ в TSQL statment. Таким образом с точки зрения производительности, трудный кодированный SQL-оператор ADO.NET не имеет никакого различия, чем LINQ.

(2), Учитывая пример, обслуживание клиентов UI имеет "функцию" передачи учетной записи. эта функция сама могла бы обновить 10 Таблиц базы данных и возвратить некоторые сообщения в одном выстреле. С LINQ необходимо создать ряд операторов и отправить их как один пакет к SQL-серверу. производительность этого перевела LINQ->, пакет TSQL может едва соответствовать хранимой процедуре. Причина? потому что можно настроить самую маленькую единицу оператора в Сохраненной процедуре при помощи встроенного инструмента профилировщика SQL и плана выполнения, Вы не можете сделать этого в LINQ.

точка при разговоре единственной Таблицы базы данных и маленького набора CRUD данных, LINQ с такой скоростью, как SP. Но для намного более сложной логики, хранимая процедура является большим количеством tweakable производительности.

(3) "LINQ к SQL" легко делает новичков для представления пожирателей ресурсов производительности. Любой старший парень TSQL может сказать Вам если не использовать КУРСОР (В основном, что Вы не должны использовать КУРСОР в TSQL в большинстве случаев). С LINQ и очаровательным "foreach" циклом с запросом, для новичка настолько легко записать такой код:

foreach(Customer c in query)
{
  c.Country = "Wonder Land";
}
ctx.SubmitChanges();

Вы видите, что этот легкий достойный код так привлекателен. Но под капотом, время выполнения.NET просто переводит это в пакет обновления. Если существует только 500 строк, это - 500 строк пакет TSQL; Если существует миллион строк, это имеет успех. Конечно, опытный пользователь не будет использовать этот способ сделать, это задание, но точка, настолько легко упасть таким образом.

17
ответ дан 23 November 2019 в 05:44
поделиться

Я думаю, что про аргумент LINQ, кажется, прибывает от людей, у которых нет истории с разработкой базы данных (в целом).

Особенно при использовании продукта как DB VS Pro или Комплект Команды, многие аргументы, приведенные здесь, не применяются, например:

Тяжелее, чтобы поддержать и Протестировать: VS обеспечивает проверку полного синтаксиса, проверку стиля, справочную и ограничительную проверку и т.д. Это также обеспечивает полные возможности поблочного тестирования и инструменты рефакторинга.

LINQ делает истинное поблочное тестирование невозможным как (в моем уме), это проваливает Тест на кислотность.

Отладка легче в LINQ: Почему? VS позволяет полный неродной в от управляемого кода и регулярной отладки SPS

Скомпилированный в единственный DLL, а не сценарии развертывания: Еще раз VS приходит на помощь, где он может создать и развернуть полные базы данных или внести безопасные от данных возрастающие изменения.

не должны изучать TSQL с LINQ: Нет Вы не делаете, но необходимо ли изучить LINQ - где преимущество?

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

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

, Прежде чем Вы все будете расстроены, я думаю, что LINQ имеет свое место и имеет главное будущее. Но для сложных, информационно емких приложений я не думаю, что это готово занять место хранимых процедур. Это было представлением, которое я повторил MVP в TechEd в этом году (они останутся неназванными).

РЕДАКТИРОВАНИЕ: LINQ стороне Хранимой процедуры SQL вещей - что-то, что я все еще должен считать больше на - в зависимости от того, что я нахожу, что могу изменить мой выше резкой критики;)

17
ответ дан Dr8k 23 November 2019 в 05:44
поделиться

LINQ чрезмерно увеличит размер кэша процедур

, Если приложение будет использовать LINQ для SQL, и запросы включают использование строк, которые могут быть очень переменными в длине, кэш процедур SQL Server станет чрезмерно увеличенным в размерах с одной версией запроса для каждой возможной длины строки. Например, считайте следующие очень простые запросы созданными против Человека. Таблица AddressTypes в базе данных AdventureWorks2008:

var p = 
    from n in x.AddressTypes 
    where n.Name == "Billing" 
    select n;

var p = 
    from n in x.AddressTypes 
    where n.Name == "Main Office" 
    select n;

, Если оба из этих запросов выполняются, мы будем видеть две записи в кэше процедур SQL Server: Один связанный с NVARCHAR (7), и другой с NVARCHAR (11). Теперь вообразите, были ли сотни или тысячи различных входных строк, все с различными длинами. Кэш процедур стал бы излишне заполненным всеми видами различных планов относительно того же самого запроса.

Больше здесь: https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx? FeedbackID=363290

27
ответ дан Nicholas 23 November 2019 в 05:44
поделиться

Для извлечения основных данных я шел бы для Linq без колебания.

Начиная с перемещения в Linq я нашел следующие преимущества:

  1. Отладка моего DAL никогда не была легче.
  2. безопасность Времени компиляции, когда Ваша схема изменяется, является бесценной.
  3. Развертывание легче, потому что все компилируется в DLL. Более руководящие сценарии развертывания.
  4. , поскольку Linq может поддерживать запросы чего-либо, что реализует интерфейс IQueryable, Вы будете в состоянии использовать тот же синтаксис для запросов XML, Объектов и любого другого источника данных, не имея необходимость изучать новый синтаксис
39
ответ дан lomaxx 23 November 2019 в 05:44
поделиться

Linq к Sql.

SQL-сервер будет кэшировать планы запросов, таким образом, не будет никакого увеличения производительности для sprocs.

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

, Если бы я работал над новым приложением с нуля прямо сейчас, я просто использовал бы Linq, никакой sprocs.

64
ответ дан Keith 23 November 2019 в 05:44
поделиться

Я обычно - сторонник помещения всего в хранимых процедурах по всем причинам, на которых DBAs были harping в течение многих лет. В случае Linq это верно, что не будет никакого различия в производительности с простыми запросами CRUD.

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

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

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

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

74
ответ дан Eric Z Beard 23 November 2019 в 05:44
поделиться

IMHO, RAD = LINQ, RUP = Stored Procs. Я много лет проработал в крупной компании из списка Fortune 500 на многих уровнях, включая менеджмент, и, честно говоря, я бы никогда не нанял разработчиков RUP для разработки RAD. Они настолько разобщены, что у них очень ограниченные знания о том, что делать на других уровнях процесса. В изолированной среде имеет смысл предоставить администраторам баз данных контроль над данными через очень конкретные точки входа, потому что другие, откровенно говоря, не знают лучших способов управления данными.

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

Иногда мне кажется, что администраторы баз данных предвзято относятся к LINQ, потому что считают, что это угрожает их безопасности работы. Но такова природа зверя, дамы и господа.

7
ответ дан 23 November 2019 в 05:44
поделиться
Другие вопросы по тегам:

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