LINQ до SQL проти збережених процедур? [зачинено]


188

Я подивився публікацію "Посібника для початківців LINQ" тут на StackOverflow ( Посібник для початківців по LINQ ), але у мене виникло додаткове запитання:

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

Отже, питання такий: для простих пошуків даних, який підхід краще, LINQ до SQL або збережених програм? Будь-які конкретні профі чи противники?

Дякую.

Відповіді:


192

Деякі переваги LINQ перед зірочками:

  1. Тип безпеки : Я думаю, що ми всі це розуміємо.
  2. Абстракція : Особливо це стосується LINQ до сутностей . Ця абстракція також дозволяє рамці додавати додаткові вдосконалення, якими ви можете легко скористатися. PLINQ - приклад додавання підтримки LINQ для багатопотокових передач. Зміни коду мінімальні, щоб додати цю підтримку. БУДЬ важче зробити цей код доступу до даних, який просто викликає паростки.
  3. Підтримка налагодження : я можу використовувати будь-який налагоджувач .NET для налагодження запитів. За допомогою паростків ви не можете легко налагодити SQL, і цей досвід значною мірою пов'язаний з постачальником вашої бази даних (MS SQL Server надає аналізатор запитів, але часто цього недостатньо).
  4. Агностика постачальників : LINQ працює з великою кількістю баз даних, а кількість підтримуваних баз даних лише збільшуватиметься. Sprocs не завжди переносяться між базами даних, або через різний синтаксис або підтримку функцій (якщо база даних взагалі підтримує відростки).
  5. Розгортання : інші вже згадували про це, але простіше розгорнути одну збірку, ніж розгорнути набір відростків. Це також пов'язане з №4.
  6. Простіше : Вам не доведеться вивчати T-SQL для доступу до даних, а також не потрібно вивчати API доступу до даних (наприклад, ADO.NET), необхідний для виклику паростків. Це пов’язано з №3 та №4.

Деякі недоліки LINQ vs паростків:

  1. Мережевий трафік : відросткам потрібно лише серіалізувати дані про ім'я парока та аргументи по дроту, в той час як LINQ надсилає весь запит. Це може стати дуже поганим, якщо запити дуже складні. Однак абстракція LINQ дозволяє Microsoft з часом покращити це.
  2. Менш гнучкі : Sprocs можуть повністю скористатися набором функцій бази даних. LINQ, як правило, є більш загальним у своїй підтримці. Це є загальним для будь-якої мови абстракції (наприклад, C # vs асемблер).
  3. Перекомпіляція : Якщо вам потрібно внести зміни в спосіб доступу до даних, вам потрібно перекомпілювати, виконати версію та повторно застосувати свою збірку. Sprocs іноді можуть дозволити DBA налаштовувати порядок доступу до даних без необхідності повторно використовувати їх .

Безпека та керованість - це те, про що люди також сперечаються.

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

Раніше я був великим хлопцем, але я взагалі починаю схилятися до LINQ як кращої альтернативи. Якщо є деякі області, де зірочки явно кращі, я, мабуть, все-таки напишу проросток, але отримаю доступ до нього за допомогою LINQ. :)


33
"LINQ працює з великою кількістю баз даних" Але LINQTOSQL підтримує тільки SQL Server.
RussellH

7
LINQ to Entities працює з Postgres та MySql на додаток до MSSQL. Не впевнений, але я подумав, що читав, що навколо є щось для Oracle.
bbqchickenrobot

devart dotConnect має річ Oracle, але це баггі як пекло. Крім того, я не можу подолати дефіцит продуктивності, який запроваджується шляхом вибору даних із бази даних, щоб оновити їх (також можливий Attach (), але це досить poopey)
Ед Джеймс,

5
Я не бачив тут, щоб хтось згадував про повторне використання коду. Ви не можете повторно використовувати linkq у додатку VB6 або asp чи файловому програмі. Якщо ви щось помістите в базу даних, то це можна повторно використовувати ВСЕ. Ви можете зробити dll з linq в ньому, я думаю, але це стає надто складним і шаленим imo. Додавання функції або збереженого програмного забезпечення, яке можна повторно використовувати, набагато простіше.
MikeKulls

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

77

Я, як правило, прихильник вкладати все в збережені процедури, з усіх причин, які DBA намагаються роками. У випадку з Linq це правда, що не буде різниці в продуктивності з простими CRUD-запитами.

Але майте на увазі кілька речей, приймаючи таке рішення: використовуючи будь-які пари ORM, ви чітко до вашої моделі даних. DBA не має свободи вносити зміни в модель даних, не змушуючи вас змінювати складений код. За допомогою збережених процедур ви можете приховати подібні зміни до певної міри, оскільки список параметрів та набір результатів, повернутих із процедури, є його контрактом, а внутрішні можуть бути змінені навколо, доки цей договір все ще виконується .

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

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

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


9
Однією з особливостей, якими ви нехтували, є безпека. З Linq вам потрібно виставити таблиці безпосередньо в програму. За допомогою збережених процедур ви можете обмежити доступ до цих програм та виконувати свої бізнес-вимоги.
NotMe

19
"DBA не має свободи вносити зміни в модель даних, не змушуючи вас змінювати скомпільований код." Чому б ви виступали за це? Ніхто не повинен мати «свободу» вносити зміни, ось в чому полягає керування конфігурацією. Зміни повинні пройти через розробник, тест тощо перед розгортанням незалежно.
Ніл Барнвелл

6
@Neil: Так, але він не може внести зміни в середовище розробки, не змусивши розробника змінити код.
Адам Робінсон

37
Я повинен сказати, що я бачив аргумент про тісне з'єднання з базами даних багато, і я не впевнений, що це справедливо. Я ніколи насправді не стикався з ситуацією (за винятком банальних прикладів), коли я хочу змінити базу даних, яка не потребує зміни коду на вище. І справді, чим взагалі відрізняється Linq від збережених програм або параметризованих запитів. Ваш рівень доступу до даних все ще повинен бути добре відокремлений та абстрагований незалежно від того, використовуєте ви ORM чи щось простіше. Саме це і дає вам вільну муфту, а не яку технологію ви використовуєте. Просто мій 2с
Саймон П Стівенс

7
Я бачив 199 збережених процедур, написаних без необхідності для кожної 1 зміни схеми, яка була захищена від додатків за допомогою підпису SP, але подібно до того, що сказав Саймон П Стівенс, семантичні зміни в застосуванні необхідних програм SP змінюються на 100% час все одно. Не кажучи вже про те, що саме існування СП просто просить якогось майбутнього розробника чи ДБА проникнути у СП. Потім ще трохи, і ще трохи.

64

Linq - Sql.

Сервер Sql буде кешувати плани запитів, тому збільшення паростків не збільшується.

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

Якби я працював над новою програмою з нуля зараз, я б просто застосував Linq, без відростків.


8
Я не погоджуюся щодо ваших коментарів щодо відсутності вигоди для паростків. Я профілював ряд підходів до доступу до SQL Server у системі prod, а використання підготуваних + збережених програм було одним з найкращих результатів. Навіть через кілька дзвінків однієї логіки. Можливо, ви праві щодо використання БД без низького використання.
торіал

Якщо ви є і будете найбільш кваліфікованим розробником запитів до баз даних, тоді використовуйте те, що вам найбільше знайоме. На відміну від процедурного коду, ви не можете сказати, "якщо він дає правильну відповідь, відправте його".
dkretz

5
@RussellH: Це стосувалося .Net 3.5, вони зафіксували це в .Net 4 (і для L2S, і для L2E)
BlueRaja - Danny Pflughoeft

3
@Kieth Не так! Від Linq створено набагато більше планів виконання, ніж SP. Переваги існують з кодом для налагодження; але проблеми з перекомпіляцією для циклу розгортання компанії; гнучкість для перевірки різних запитів на дії, де і замовити. Зміна порядку твердження WHERE може спричинити обробку іншого запиту; попереднє отримання; це неможливо зробити легко в Linq. Потрібно мати рівень даних для налаштування. SP важче підтримувати та перевіряти? Якщо ви до цього не звикли; але SP є вигідними для корпусу та VLDB, високої доступності тощо! Linq призначений для малих проектів, сольної роботи; действуй.
SnapJag

4
@SnapJag - Ти маєш рацію, що ростки дають тобіший контроль над зерном, але факт полягає в тому, що 99% часу (навіть у великих корпоративних системах, в яких я працюю) не потребує додаткової оптимізації. Sprocs важче підтримувати та перевіряти, звикли ви до них чи ні - я дуже звик до них (я був DBA до того, як я був розробником) і забезпечую, щоб провідник для кожної операції CRUD для завантаження різних таблиць був на сьогоднішній день - це біль. Найкраща практика (IMHO) полягає в кодуванні найпростішим способом, після чого виконуйте перевірки ефективності та оптимізуйте лише там, де це потрібно.
Кіт

40

Щодо пошуку основних даних, я б без вагань збирався Linq.

Після переїзду до Linq я виявив такі переваги:

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

1
для мене складання безпеки часу є ключовим!
bbqchickenrobot

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

3
Розгортання SQL-скриптів, для яких не потрібно проходити QA, не обов'язково добре.
laang

27

LINQ роздує кеш процедури

Якщо програма використовує LINQ для 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


10
Який дурний аргумент - просто використовуйте змінну і ваша проблема вирішена.
ДжонОпінкар

6
@John, це не допоможе, якщо ви використовували валідату замість буквальної рядки, оскільки наприкінці ви надсилаєте буквальну рядок до бази даних. це може виглядати як змінна у вашому коді, але це буде рядок у створеному T-SQL, який надсилається до БД.
kay.one

15
SQLMenace: Відповідно до сторінки, на яку ви пов’язані, проблема вирішується у VS2010.
Марк Байєрс

8
Це питання було дійсним під час опублікування відповіді, але відтоді воно було вирішене у VS2010, тому це питання вже не є.
Brain2000

17

Я думаю, що аргумент про LINQ, здається, походить від людей, які не мають історії з розробкою баз даних (загалом).

Особливо, якщо використовувати такий продукт, як VS DB Pro або Team Suite, багато аргументів, наведених тут, не застосовуються, наприклад:

Важче у обслуговуванні та тестуванні: VS забезпечує повну перевірку синтаксису, перевірку стилів, перевірку референсів та обмежень тощо. Він також забезпечує повну можливість тестування одиниць та інструменти рефакторингу.

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

Налагодження простіше в LINQ: Чому? VS дозволяє здійснювати повне вхід з керованого коду та регулярну налагодження SP.

Скомпільований в єдину DLL, а не в сценарії розгортання. Ще раз VS приходить на допомогу, де він може створювати та розгортати повні бази даних або робити додаткові зміни, безпечні для даних.

Не потрібно вивчати TSQL за допомогою LINQ: Ні, ви цього не робите, але ви повинні вивчити LINQ - де користь?

Я справді не вважаю це користю. Бути в змозі щось змінити ізольовано, теоретично може звучати добре, але тільки тому, що зміни виконують контракт, не означає, що це поверне правильні результати. Щоб мати можливість визначити, які правильні результати, вам потрібен контекст, і ви отримаєте цей контекст з коду виклику.

Гм, слабко поєднані програми - це кінцева мета всіх хороших програмістів, оскільки вони дійсно збільшують гнучкість. Можливість змінити речі поодинці - це фантастично, і саме ваші одиничні тести забезпечать, що вона все одно повертає відповідні результати.

Перш ніж все засмутитися, я думаю, що LINQ має своє місце і має грандіозне майбутнє. Але для складних додатків, що вимагають великих даних, я не думаю, що вони готові зайняти місце збережених процедур. Цю думку я одержав відгук MVP в TechEd цього року (вони залишаться безіменними).

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


4
Вивчити LINQ - це не велика справа - це просто синтаксичний цукор. TSQL - це зовсім інша мова. Яблука та апельсини.
Адам Лассек

3
Перевага вивчення LINQ полягає в тому, що він не пов'язаний з єдиною технологією - семантика запитів може використовуватися для XML, об'єктів тощо, і це розшириться з часом.
Дейв Р.

5
Домовились! Тож багато людей (розробників) шукають рішення "швидкого збуту на ринку" у невеликих командах та проектах. Але якщо розробка буде перенесена на наступний рівень корпоративного стилю з декількома командами, великими базами даних, об'ємними, доступними, розподіленими системами, використовувати LINQ буде інша історія! Я не вірю, що вам буде потрібно редагувати свою думку через занадто довгий час. LINQ не призначений для проектів / команд, які мають більший розмір і мають декілька людей, кілька команд (Dev & DBA) та мають чіткий графік розгортання.
SnapJag

17

LINQ є новим і має своє місце. LINQ не придуманий для заміни збереженої процедури.

Тут я зупинюсь на деяких міфах щодо продуктивності та CONS, лише для "LINQ до SQL", я, звичайно, можу бути абсолютно невірним ;-)

(1) Люди кажуть, що LINQ-повідомлення може «кешувати» на SQL-сервері, тому він не втрачає продуктивності. Частково правда. "LINQ в SQL" насправді - це час перекладу синтаксису LINQ в текст TSQL. Отже, з точки зору продуктивності, твердо кодований оператор ADO.NET SQL не має різниці, ніж 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 рядків; Якщо є мільйон рядків, це хіт. Звичайно, досвідчений користувач не використовуватиме цей спосіб для виконання цієї роботи, але справа в тому, що так легко падати таким чином.


2
легко не вдається за допомогою покажчиків на C / C ++ / C # це означає, що його ніколи не слід використовувати?
bbqchickenrobot

1
Скільки програмістів середнього рівня займаються покажчиками? Linq виставляє цю можливість кодеру будь-якого рівня, тобто ризик помилки різко зростає.
Жак

1
Ви порівнюєте новачків у LINQ зі старшим хлопцем TSQL. Не дуже чесне порівняння. Я погодився б з вашим кодом, LINQ взагалі не є виконавцем для оновлення / видалення пакетів. Однак я б заперечував, що більшість аргументів щодо ефективності між LINQ та SP є претензіями, але не ґрунтуються на мірі
laang

12

Найкращий код - це не код, і для збережених процедур вам потрібно написати хоча б якийсь код у базі даних та код у програмі, щоб викликати його, тоді як для LINQ до SQL або LINQ для сутностей вам не потрібно писати додаткових код за межами будь-якого іншого запиту LINQ окрім інстанції контекстного об'єкта.


10

LINQ, безумовно, має місце в базі даних, що стосуються додатків, і в малому бізнесі.

Але на великому підприємстві, де центральні бази даних служать вузлом загальних даних для багатьох додатків, нам потрібна абстракція. Нам потрібно централізовано керувати безпекою та показувати історії доступу. Нам потрібно вміти робити аналіз впливу: якщо я вніс невелику зміну в модель даних, щоб забезпечити нову потребу в бізнесі, які запити потрібно змінити та які додатки потрібно повторно перевірити? Перегляди та збережені процедури дають мені це. Якщо LINQ може все це зробити і зробити наших програмістів більш продуктивними, я вітаю - хтось має досвід використання цього в такому середовищі?


2
Ви піднімаєте хорошу точку; LINQ не є альтернативою в цьому випадку.
Meta-Knight

1
Усі ваші програми повинні використовувати загальний рівень доступу до даних (звичайно, це не завжди). Якщо це так, то ви можете внести одну зміну до загальної бібліотеки та повторно використовувати. Ви також можете використовувати щось на зразок WCF для обробки доступу до даних для вас. Існує хороший шар абстракції, який технічно може використовувати linq для доступу до даних за кадром. Я думаю, все залежить лише від того, що ваші хлопці придумують вашим вимогам щодо використання SPs проти Linq.
bbqchickenrobot

8

DBA не має свободи вносити зміни в модель даних, не змушуючи вас змінювати складений код. За допомогою збережених процедур ви можете приховати подібні зміни до певної міри, оскільки список параметрів та набір результатів, повернутих із процедури, є його контрактом, а внутрішні можуть бути змінені навколо, доки цей договір все ще виконується .

Я справді не вважаю це користю. Бути в змозі щось змінити ізольовано, теоретично може звучати добре, але тільки тому, що зміни виконують контракт, не означає, що це поверне правильні результати. Щоб мати можливість визначити, які правильні результати, вам потрібен контекст, і ви отримаєте цей контекст з коду виклику.


7

IMHO, RAD = LINQ, RUP = Збережені програми. Я працював у великій компанії Fortune 500 протягом багатьох років, на багатьох рівнях, включаючи управління, і, чесно кажучи, я ніколи не наймав розробників RUP для розробки RAD. Вони настільки осімі, що вони дуже обмежені знання, що робити на інших рівнях процесу. У оточеному середовищі має сенс надати DBA контролю над даними через дуже конкретні точки введення, оскільки інші, чесно кажучи, не знають кращих способів управління даними.

Але великі підприємства болісно повільно рухаються на арені розвитку, і це надзвичайно дорого. Бувають випадки, коли вам потрібно рухатись швидше, щоб заощадити і час, і гроші, і LINQ надає це і багато іншого в лопатах.

Іноді я думаю, що DBA є упередженими щодо LINQ, оскільки вони вважають, що це загрожує безпеці їх роботи. Але така природа звіра, пані та панове.


3
Так, ми, DBA, сидимо навколо, чекаючи цілий день, щоб ви запросили на виробництво потік Stored Proc. Якщо цього не робити, це зламає наші серця!
Сем

6

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

A) Введення всієї вашої логіки у linq означає, що ваша база даних є менш корисною, оскільки лише ваша програма може споживати її.

Б) Я не переконаний, що моделювання об'єктів все-таки краще, ніж реляційне моделювання.

C) Тестування та розробка збереженої процедури в SQL - це пекло набагато швидше, ніж цикл редагування компіляції в будь-якому середовищі Visual Studio. Ви просто редагуєте, F5 і натискаєте селектор, і ви їдете на гонки.

D) Простіше керувати та розгортати збережені процедури, ніж збірки. Ви просто помістите файл на сервер і натисніть F5 ...

E) Linq to sql як і раніше записує шалений код у ті часи, коли ви цього не очікуєте.

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


5

LINQ не забороняє використовувати збережені процедури. Я використовував змішаний режим з LINQ-SQL і LINQ-зберігаєтьсяproc . Особисто я радий, що мені не потрібно писати збережені документи .... pwet-tu.


4

Також є питання про можливий відкат 2.0. Повірте мені, це траплялося зі мною пару разів, тому я впевнений, що це трапилося і з іншими.

Я також згоден, що абстракція найкраща. Поряд з фактом, первісна мета ОРМ - змусити RDBMS добре узгоджуватися з концепціями ОО. Однак, якщо до LINQ все працювало нормально, потрібно трохи відхилитися від понять OO, тоді викрутіть їх. Поняття та реальність не завжди добре поєднуються. В ІТ немає місця для войовничих завзятих.


3

Я припускаю, що ви маєте на увазі Linq To Sql

Для будь-якої команди CRUD легко профілювати продуктивність збереженої процедури проти будь-якої технології. У цьому випадку будь-яка різниця між ними буде незначною. Спробуйте профілювати для 5 (простих типів) польовий об'єкт понад 100 000 обраних запитів, щоб з’ясувати, чи є реальна різниця.

З іншого боку, справжнім укладачем угод стане питання про те, чи вам зручно розміщувати свою бізнес-логіку у вашій базі даних чи ні, що є аргументом проти збережених процедур.


1
Оскільки більше місць, ніж додаток, можуть впливати на дані - імпорт даних, інші програми, прямі запити тощо, нерозумно не заносити бізнес-логіку в базу даних. Але якщо цілісність даних не стосується вас, продовжуйте.
HLGEM

3
Бізнес-логіка не повинна входити в базу даних. Він повинен бути мовою програмування, де його легко налагоджувати та керувати. Потім їх можна ділити між програмами як об’єкти. Деякі правила можуть бути в базі даних, але не в бізнес-логіці.
4thSpace

3

За словами гуру, я визначаю LINQ як мотоцикл, а SP як автомобіль. Якщо ви хочете поїхати в коротку поїздку і мати лише маленьких пасажирів (у цьому випадку 2), виїжджайте вишукано з LINQ. Але якщо ви хочете відправитися в подорож і мати велику групу, я думаю, вам слід вибрати SP.

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

Сподіваюся, це допоможе, я можу помилятися. : D


1
друзі загинули на автомобілі: P
Алекс

2
люди також загинули за кермом автомобіля.
laang

1
так, ви помиляєтесь
Асад Алі

3

Усі ці відповіді, схиляючись до LINQ, в основному говорять про ПРОСТО РОЗВИТКУ, яке більш-менш пов'язане з поганою якістю кодування або ліністю кодування. Я лише такий.

Деякі переваги або Linq, я читаю тут як, легко перевірити, легко налагоджувати і т. Д., Але вони відсутні там, де підключено до Кінцевого виводу або кінцевого користувача. Це завжди спричиняє проблеми кінцевому користувачеві щодо продуктивності. Який сенс завантажувати багато речей у пам'ять, а потім застосовувати фільтри, використовуючи LINQ?

Знову ж таки, TypeSafety - це застереження, що "ми обережні, щоб уникнути неправильної клавіатури", що знову низької якості ми намагаємося покращити, використовуючи linq. Навіть у такому випадку, якщо щось у базі даних зміниться, наприклад розмір стовпця String, тоді linq потрібно перекомпілювати і не буде без цього безпечним.

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

Перестаньте лінуватися. Я дуже стараюся. :)


4
Завантажуєте все в пам'ять і фільтруєте? Linq може надіслати фільтр як частину запиту до бази даних і повертає відфільтрований набір результатів.
laang

Є досить багато людей, які вважають, що LINQ завантажує всі дані та обробляє їх за допомогою циклу foreach. Це неправильно. Він просто збирається в sql-запит і забезпечує майже таку ж ефективність для більшості операцій CRUD. Але так, це не срібна куля. Бувають випадки, коли використання T-SQL або збережених програм може виявитися кращим.
Це пастка

Я погоджуюсь на обидва контр-аргументи. Однак не зовсім вірно, що linq посилає всі фільтри до СУБД для роботи над нею. Є кілька речей, які працюють на пам'ять, одна з них є чіткою.
Маніш

2

Для простих операцій CRUD з єдиною точкою доступу до даних я б сказав, що перейдіть на LINQ, якщо вам зручно з синтаксисом. Що стосується більш складної логіки, я думаю, що відростки є більш ефективними, якщо ви добре володієте T-SQL та його більш досконалими операціями. Вам також надається допомога з налаштування консультанта, SQL Server Profiler, налагодження запитів із SSMS тощо.


2

Збережена процедура полегшує тестування, і ви можете змінити запит, не торкаючись коду програми. Також із linq отримання даних не означає його правильних даних. І перевірити правильність даних означає запустити програму, але зі збереженою процедурою її легко перевірити, не торкаючись програми.


1

Результат можна підсумувати як

LinqToSql для невеликих сайтів та прототипів. Це дійсно економить час для прототипування.

Sps: Універсальний. Я можу точно налаштувати свої запити і завжди перевіряти ActualExecutionPlan / EstimatedExecutionPlan.



0

І LINQ, і SQL мають свої місця. У обох є свої недоліки та переваги.

Іноді для складного пошуку даних вам можуть знадобитися збережені документи. І іноді ви можете захотіти, щоб інші користувачі використовували вашу збережену програму в Sql Server Management Studio.

Linq to Entities чудово підходить для швидкого розвитку CRUD.

Звичайно, ви можете створити додаток, використовуючи лише одне чи інше. Або ви можете змішати його. Все зводиться до ваших вимог. Але програми, що зберігаються в SQL, незабаром не зникнуть.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.