LINQ-to-SQL против хранимых процедур?

Я просмотрел сообщение «Руководство для начинающих по LINQ» здесь, в StackOverflow (Руководство для начинающих по LINQ), но у меня возник вопрос:

Мы собираемся развернуть новый проект, в котором почти все наши операции с базой данных будут довольно простыми извлечениями данных (есть еще один сегмент проекта, который уже записывает данные). Большинство других наших проектов до этого момента используют хранимые процедуры для таких вещей. Однако я хотел бы использовать LINQ-to-SQL, если это имеет смысл.

Итак, вопрос таков: какой подход лучше для простого извлечения данных, LINQ-to-SQL или хранимые процедуры? Есть какие-то конкретные плюсы или минусы?

Спасибо.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
189
0
108 138
22
Перейти к ответу Данный вопрос помечен как решенный

Ответы 22

Linq в Sql.

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

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

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

Я не согласен с вашими комментариями об отсутствии выгоды для sprocs. Я описал серию подходов к доступу к SQL Server в системе prod, и использование Prepare + stored procs дало одни из лучших результатов. Даже при нескольких вызовах одной и той же логики. Возможно, вы правы в отношении БД с низким уровнем использования.

torial 20.10.2008 07:24

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

dkretz 03.12.2008 08:55

Я думаю, что LINQ to SQL может вызвать перекомпиляцию при изменении размера строкового параметра.

RussellH 13.01.2009 00:12

@RussellH: Это было верно для .Net 3.5, они исправили это в .Net 4 (как для L2S, так и для L2E)

BlueRaja - Danny Pflughoeft 04.05.2010 17:32

@Kieth Не тот случай! Из Linq создается гораздо больше планов выполнения, чем из SP. Преимущества существуют с кодом для отладки; но проблемы с перекомпиляцией для корпоративного цикла развертывания; отсутствие гибкости для тестирования различных запросов ACTION, WHERE, ORDER BY. Изменение порядка оператора WHERE может привести к обработке другого запроса; предварительная выборка; это нелегко сделать в Linq. Необходимо, чтобы уровень данных был доступен для настройки. SP сложнее поддерживать и тестировать? Если вы к этому не привыкли; но SP выгодны для корпусов и VLDB, высокой доступности и т. д.! Linq - для небольших проектов, сольной работы; Действуй.

SnapJag 28.07.2010 19:49

@SnapJag - Вы правы, что sprocs дают вам более точный контроль зернистости, но факт в том, что в 99% случаев (даже в больших корпоративных системах, в которых я работаю) вам не нужна дополнительная оптимизация. Sprocs сложнее поддерживать и проверять, привыкли вы к ним или нет - я очень к ним привык (я был администратором баз данных, прежде чем стать разработчиком) и следить за тем, чтобы sproc для каждой операции CRUD для множества разных таблиц был на сегодняшний день это боль. Лучшая практика (IMHO) - это кодировать наиболее простым способом, а затем запускать проверки производительности и оптимизировать только там, где это необходимо.

Keith 29.07.2010 11:46

Я предполагаю, что вы имеете в виду Linq To Sql

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

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

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

HLGEM 11.11.2008 17:10

Бизнес-логика не должна входить в базу данных. Он должен быть на языке программирования, где его легко отлаживать и управлять. Затем его можно использовать в приложениях как объекты. Некоторые правила могут быть в базе данных, но не бизнес-логика.

4thSpace 02.02.2009 09:46

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

немного опоздал на вечеринку, но мне понравился этот ответ;)

jellz77 26.08.2020 20:43

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

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

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

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

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

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

NotMe 26.11.2008 18:46

Мне нравится ваша идея гибридного подхода: если это простой CRUD, который не требует объединений и блокировок, особенно если вы просто запрашиваете одно поле, то вы знаете, что схема не изменится, и вы не попадете в драки. с DBA.

devlord 28.01.2009 00:30

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

Neil Barnwell 03.03.2009 20:22

@ Нил: Да, но он не может вносить изменения в среду разработки, не заставляя разработчика менять код.

Adam Robinson 15.04.2009 18:56

Должен сказать, что я много раз видел аргументы о тесной связи с базами данных, и я не уверен, что это действительно так. Я никогда не сталкивался с ситуацией (помимо тривиальных примеров), когда я хочу изменить базу данных, которая в любом случае не требует изменения кода выше. И действительно, чем в любом случае Linq отличается от хранимых процедур или параметризованных запросов. Уровень доступа к данным должен быть четко отделен и абстрагирован независимо от того, используете ли вы ORM или что-то попроще. Это то, что дает вам слабую связь, а не то, какую технологию вы используете. Просто мой 2с

Simon P Stevens 19.06.2009 21:40

@Chris: проблема безопасности, о которой вы говорите, легко решается с помощью представлений и ролей.

Chris Burgess 27.06.2009 18:00

@Eric - Отличные комментарии. Я разработчик и администратор базы данных. Я ношу обе шляпы в консультационных целях и выступаю за то же. LINQ имеет свое место, он не заменяет SP. Что действительно улучшает, так это способность небольших проектов / команд выводить продукт на рынок. Но низкими будут те дни, когда компания / проект станет большой и ей придется адаптироваться к высокой доступности, VLDB, настройке, подсказкам, сложным запросам и т. д. Я никогда не смогу использовать Linq в своих крупномасштабных решениях с высокой доступностью. . Особенно, когда есть команды программистов и администраторов баз данных, которые сотрудничают, чтобы предоставить большие надежные решения.

SnapJag 28.07.2010 19:54

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

MikeKulls 29.03.2012 02:08

Я видел 199 хранимых процедур, написанных без необходимости для каждого 1 изменения схемы, которое было защищено от приложений с помощью подписи SP, но, как и сказал Саймон П. Стивенс, семантические изменения в использовании SP требовали изменений приложения на 100% в любом случае время. Не говоря уже о том факте, что само существование SP просто умоляет некоторых будущих разработчиков или dba утилизировать некоторую бизнес-логику в SP. Потом еще немного и еще немного.

user74754 25.07.2012 02:50

@Eric LINQ to ADO.NET Entities не привязывает вас к модели данных. С помощью структуры сущностей вы определяете концептуальную модель данных, которая сопоставляется с моделью хранения, которую вы можете изменить в любое время, даже без компиляции (при условии, что сопоставление находится в текстовом файле, а не является частью двоичного файла).

Mark Cidade 18.08.2008 17:16

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

Microsoft Developer 26.04.2019 15:47

База данных @MicrosoftDeveloper хранит бизнес-данные и использует SQL для их обработки. Обработка данных - это не работа модных веб-приложений. Использование ORM для обработки огромного количества данных звучит уже давно устаревшими 90-ми. Для работы с базой данных нам необходимо использовать SQL и Sproc, и, как бы сильно это ни ненавидели некоторые люди, им нужно с этим жить.

Sabyasachi Mitra 30.07.2020 15:28

Для получения базовых данных я бы без колебаний выбрал Linq.

С момента перехода на Linq я обнаружил следующие преимущества:

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

для меня безопасность времени компиляции является ключевым моментом!

bbqchickenrobot 08.07.2009 21:36

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

SnapJag 28.07.2010 19:56

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

liang 14.05.2015 09:53

A DBA has no freedom to make changes to the data model without forcing you to change your compiled code. With stored procedures, you can hide these sorts of changes to an extent, since the parameter list and results set(s) returned from a procedure represent its contract, and the innards can be changed around, just so long as that contract is still met.

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

Ответ принят как подходящий

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

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

Некоторые недостатки LINQ vs sprocs:

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

О безопасности и управляемости тоже спорят.

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

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

«LINQ работает с большим количеством баз данных» Но LINQTOSQL поддерживает только SQL Server.

RussellH 24.12.2008 04:27

LINQ to Entities работает с Postgres и MySql в дополнение к MSSQL. Не уверен, но мне показалось, что я читал, что есть что-то для Oracle.

bbqchickenrobot 08.07.2009 21:36

В devart dotConnect есть функция Oracle, но она чертовски глючит. Кроме того, я не могу преодолеть дефицит производительности, который возникает из-за необходимости выбирать данные из базы данных для их обновления (Attach () также возможен, но это довольно неприятно)

Ed James 02.03.2010 18:46

Я не видел, чтобы здесь кто-нибудь упоминал о повторном использовании кода. Вы не можете повторно использовать linq в приложении VB6, asp или file maker pro. Если вы поместите что-то в базу данных, это можно будет повторно использовать ВЕЗДЕ. Я думаю, вы могли бы создать dll с linq, но это становится слишком сложным и дерьмовым, imo. Гораздо проще добавить функцию или сохраненную процедуру, которую можно использовать повторно.

MikeKulls 09.03.2012 04:42

Говоря о повторном использовании кода в TSQL (1) удачи, пытаясь сохранить результаты хранимой процедуры во временную таблицу, не прибегая к динамическому sql. (2) Вы мало что можете сделать, чтобы организовать все свои процессы / функции; пространство имен быстро становится загроможденным. (3) Вы написали мощный оператор выбора, но теперь вы хотите, чтобы пользователь мог выбирать столбец, который будет отсортирован - в TSQL вам, возможно, придется использовать CTE, который задает row_number для каждого столбца, который может быть отсортирован; в LINQ ее можно решить с помощью нескольких операторов if, задумываясь позже.

sparebytes 03.12.2013 21:07

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

rm-code 08.02.2021 08:08

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

LINQ раздувает кеш процедур

Если приложение использует LINQ to SQL, а запросы включают использование строк, длина которых может сильно варьироваться, кэш процедур SQL Server станет раздутым с одной версией запроса для каждой возможной длины строки. Например, рассмотрим следующие очень простые запросы, созданные для таблицы Person.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

Какой глупый аргумент - просто используйте переменную, и ваша проблема будет решена.

JohnOpincar 24.06.2009 05:27

@John, это не поможет, если вы использовали валидацию вместо буквальной строки, поскольку в конце вы отправляете буквальную строку в базу данных. он может выглядеть как переменная в вашем коде, но это будет строка в сгенерированном T-SQL, которая будет отправлена ​​в БД.

kay.one 27.07.2009 03:42

SQLMenace: согласно странице, на которую вы ссылаетесь, проблема решена в VS2010.

Mark Byers 07.04.2010 15:47

Эта проблема была действительной на момент публикации ответа, но с тех пор она была решена в VS2010, так что это больше не проблема.

Brain2000 06.12.2011 22:45

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

Многие из приведенных здесь аргументов неприменимы, особенно при использовании такого продукта, как VS DB Pro или Team Suite, например:

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

LINQ делает невозможным истинное модульное тестирование, поскольку (на мой взгляд) не проходит тест ACID.

LINQ упрощает отладку: Почему? VS позволяет выполнять полный переход от управляемого кода и регулярную отладку SP.

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

Не нужно изучать TSQL с LINQ: Нет, не знаете, но вам нужно изучить LINQ - в чем польза?

I really don't see this as being a benefit. Being able to change something in isolation might sound good in theory, but just because the changes fulfil a contract doesn't mean it's returning the correct results. To be able to determine what the correct results are you need context and you get that context from the calling code.

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

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

Обновлено: Сторона хранимой процедуры LINQ to SQL - это то, о чем мне все еще нужно прочитать больше - в зависимости от того, что я нахожу, я могу изменить свою вышеупомянутую диатрибу;)

Изучение LINQ не составляет большого труда - это просто синтаксический сахар. TSQL - это совершенно другой язык. Яблоки и апельсины.

Adam Lassek 09.10.2008 19:04

Преимущество изучения LINQ заключается в том, что он не привязан к одной технологии - семантика запросов может использоваться для XML, объектов и т. д., И со временем она будет расширяться.

Dave R. 18.12.2008 19:33

Согласовано! Так много людей (разработчиков) ищут решение, позволяющее ускорить вывод на рынок в небольших командах и проектах. Но если разработка выйдет на новый уровень корпоративного стиля с несколькими командами, большими базами данных, распределенными системами большого объема и высокой доступностью, использование LINQ будет совсем другим! Я не верю, что вам понадобится слишком долго редактировать свое мнение. LINQ не предназначен для более крупных проектов / команд, в которых задействовано несколько человек, несколько команд (разработчики и администраторы баз данных), И они имеют строгий график развертывания.

SnapJag 28.07.2010 20:02

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

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

Вы поднимаете хороший вопрос; LINQ в этом случае не является альтернативой.

Meta-Knight 08.06.2009 23:34

Все ваши приложения должны использовать уровень доступа к данным общий (конечно, это не всегда так). Если да, то вы можете внести одно изменение в общую библиотеку и выполнить повторное развертывание. Вы также можете использовать что-то вроде WCF для обработки доступа к данным за вас. Есть хороший уровень абстракции, который технически может использовать linq для доступа к данным за кулисами. Я думаю, все зависит от того, что ваши ребята придумали для ваших требований в отношении использования SP против Linq.

bbqchickenrobot 08.07.2009 22:25

Также существует проблема возможного отката 2.0. Поверьте, это случалось со мной пару раз, поэтому я уверен, что это случилось с другими.

Я также согласен с тем, что абстракция лучше всего. Наряду с этим, первоначальная цель ORM состоит в том, чтобы обеспечить соответствие РСУБД концепциям объектно-ориентированного программирования. Однако, если до LINQ все работало нормально из-за того, что приходилось немного отклоняться от концепций объектно-ориентированного проектирования, тогда к черту. Концепции и реальность не всегда хорошо сочетаются друг с другом. В IT нет места воинствующим фанатикам.

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

Здесь я сосредоточусь на некоторых мифах о производительности и недостатках, только для «LINQ to SQL», конечно, я могу ошибаться ;-)

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

(2) Рассмотрим пример, пользовательский интерфейс обслуживания клиентов имеет функцию «передачи учетной записи». сама эта функция может обновлять 10 таблиц БД и возвращать несколько сообщений за один раз. Используя LINQ, вы должны создать набор операторов и отправить их одним пакетом на SQL-сервер. производительность этого переведенного пакета LINQ-> TSQL вряд ли может соответствовать хранимой процедуре. Причина? поскольку вы можете настроить наименьшую единицу оператора в хранимой процедуре с помощью встроенного профилировщика SQL и инструмента плана выполнения, вы не можете сделать это в LINQ.

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

(3) «LINQ to SQL» легко заставляет новичков вводить ограничения производительности. Любой старший специалист по TSQL может сказать вам, когда не следует использовать CURSOR (в большинстве случаев вам не следует использовать CURSOR в TSQL). С LINQ и очаровательным циклом foreach с запросом новичку так легко написать такой код:

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

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

легко потерпеть неудачу с указателями в C / C++ / C#, значит ли это, что их никогда не следует использовать?

bbqchickenrobot 08.07.2009 22:27

Сколько программистов среднего уровня имеют дело с указателями? Linq предоставляет эту возможность любому кодировщику уровней, что значительно увеличивает риск ошибки.

Jacques 18.03.2011 12:09

Вы сравниваете новичков в LINQ со старшим парнем из TSQL. Не совсем справедливое сравнение. Я согласен с вашим кодом, LINQ не работает для пакетного обновления / удаления в целом. Однако я бы сказал, что большинство аргументов в отношении производительности между LINQ и SP являются утверждениями, но не основаны на измерении.

liang 14.05.2015 09:34

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

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

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

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

Sam 25.02.2011 00:00

Я не администратор баз данных, но ваше представление о вакансиях администраторов баз данных очень необоснованно. Вероятно, в небольшом стартапе, создающем модное мобильное приложение, они не требуются (где вы в основном найдете разработчиков, ненавидящих SQL), но для безопасности данных крупного предприятия доступность абсолютно важна. Я видел множество инцидентов, когда разработчикам БД и администраторам баз данных приходилось оптимизировать дрянной код, написанный так называемыми разработчиками RAD, которые не понимают, как работает база данных.

Sabyasachi Mitra 30.07.2020 15:58

По словам гуру, я определяю LINQ как мотоцикл, а SP как автомобиль. Если вы хотите совершить короткую поездку и у вас есть только маленькие пассажиры (в данном случае 2), используйте LINQ изящно. Но если вы хотите отправиться в путешествие и иметь большую группу, я думаю, вам следует выбрать SP.

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

Надеюсь, это поможет, но могу ошибаться. : D

друзья погибли на мотоциклах: P

Alex 25.07.2012 02:28

люди погибли и за рулем автомобиля.

liang 14.05.2015 08:29

да ты не прав.

Asad Ali 22.03.2017 18:40

И LINQ, и SQL имеют свои места. У обоих есть свои недостатки и преимущества.

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

Linq to Entities отлично подходит для быстрой разработки CRUD.

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

Результат можно резюмировать как

LinqToSql для небольших сайтов и прототипов. Это действительно экономит время на прототипирование.

СПС: Универсальный. Я могу точно настроить свои запросы и всегда проверять ActualExecutionPlan / EstimatedExecutionPlan.

Create PROCEDURE userInfoProcedure
    -- Add the parameters for the stored procedure here
    @FirstName varchar,
    @LastName varchar
AS
BEGIN

    SET NOCOUNT ON;

    -- Insert statements for procedure here
    SELECT FirstName  , LastName,Age from UserInfo where FirstName=@FirstName
    and LastName=@FirstName
END
GO

http://www.totaldotnet.com/Article/ShowArticle121_StoreProcBasic.aspx

Какой в ​​этом смысл?

Teoman shipahi 31.07.2015 17:13

Я думаю нужно идти с проков ни на что реальное.

A) Написание всей вашей логики в linq означает, что ваша база данных менее полезна, потому что только ваше приложение может ее использовать.

Б) Я не уверен, что объектное моделирование лучше, чем реляционное моделирование.

C) Тестирование и разработка хранимой процедуры в SQL происходит намного быстрее, чем цикл редактирования компиляции в любой среде Visual Studio. Вы просто редактируете, F5 и нажимаете select, и вы отправляетесь в гонки.

D) Хранимые процедуры проще управлять и развертывать, чем сборки .. вы просто кладете файл на сервер и нажимаете F5 ...

E) Linq to sql по-прежнему пишет дрянной код, когда вы этого не ожидаете.

Честно говоря, я думаю, что в конечном итоге MS могла бы дополнить t-sql, чтобы он мог выполнять проекцию соединения неявно, как это делает linq. t-sql должен знать, хотите ли вы, например, сделать order.lineitems.part.

Хранимая процедура упрощает тестирование, и вы можете изменить запрос, не касаясь кода приложения. Также с linq получение данных не означает, что это правильные данные. А проверка правильности данных означает запуск приложения, но с хранимой процедурой легко проверить, не касаясь приложения.

Для простых операций CRUD с единственной точкой доступа к данным я бы посоветовал перейти на LINQ, если вы чувствуете себя комфортно с синтаксисом. Я думаю, что для более сложной логики sprocs более эффективны с точки зрения производительности, если вы хорошо разбираетесь в T-SQL и его более сложных операциях. У вас также есть помощь от Tuning Advisor, SQL Server Profiler, отладки ваших запросов из SSMS и т. д.

Все эти ответы, склоняющиеся к LINQ, в основном говорят о ПРОСТОТА РАЗРАБОТКИ, которая более или менее связана с низким качеством кодирования или ленью в кодировании. Я только такой.

Я читаю здесь некоторые преимущества Linq: их легко протестировать, легко отладить и т. д., Но они не связаны с Final output или конечным пользователем. Это всегда вызывает проблемы с производительностью конечного пользователя. Какой смысл загружать много вещей в память, а затем применять фильтры при использовании LINQ?

Опять же TypeSafety - это предупреждение о том, что «мы осторожны, чтобы избежать неправильного приведения типов», что опять же плохого качества, которое мы пытаемся улучшить с помощью linq. Даже в этом случае, если что-то изменится в базе данных, например размер столбца String, то linq необходимо перекомпилировать, и без этого он не будет безопасным по типу .. Я пробовал.

Хотя мы обнаружили, что при работе с LINQ это хорошо, мило, интересно и т. д., У него есть серьезный недостаток, заключающийся в том, что разработчик становится ленивым :) и 1000 раз доказано, что это плохо (может быть хуже) с точки зрения производительности по сравнению с хранимыми процедурами.

Перестань лениться. Я очень стараюсь. :)

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

liang 10.04.2013 05:41

Есть немало людей, которые считают, что LINQ загружает все данные и обрабатывает их с помощью цикла foreach. Это неверно. Он просто компилируется в запрос sql и обеспечивает почти такую ​​же производительность для большинства операций CRUD. Но да, это не серебряная пуля. Бывают случаи, когда использование T-SQL или хранимых процедур может оказаться лучше.

It's a trap 08.03.2017 15:57

Я согласен с обоими контраргументами. Однако не совсем верно, что linq отправляет в СУБД все фильтры для работы с ней. Есть несколько вещей, которые работают в памяти, одна из них отличается.

Manish 02.11.2017 23:25

Другие вопросы по теме