SQL Server: not only SQL, а дещо більше

💡 Усі статті, обговорення, новини про Java — в одному місці. Приєднуйтесь до Java спільноти!

Хочу одразу сказати, якщо ви очікуєте прочитати тут про реалізацію NoSQL в Microsoft SQL Server, то не витрачайте час: мова піде не про це. В статті я хочу зробити огляд мов програмування, які можна застосувати в цій СКБД, використовуючи можливості, недоступні або складні для реалізації в рамках мови Transact-SQL.

Кілька разів в моїй роботі були ситуації, коли якийсь функціонал системи я пропонував перенести із сервісної програми, написаній на мейнстрімній мові (найчастіше C#, оскільки працювали переважно в екосистемі Microsoft) в базу даних. Це могли бути запит до API чи вебсторінки, парсинг html, запуск якихось сервісів тощо. Зазвичай це дозволяло спростити систему і зробити її легшою в керуванні.

І зазвичай ця розмова виглядала приблизно так:
— Ні, це неможливо!
— Чому?
— Нас вчили, що база даних призначена тільки для зберігання даних!
— А якщо вас вчили неправильно?
— Хм... Ну, може так. Але нам в команду не дали DB Developer’а, бо вирішили, що базу даних може зліпити і C# (Java, Go etc) Developer. Тому будемо робити не як краще, а як уміємо (або як вчили).

Будучи знайомим з багатьма вчорашніми студентами, знаю, що загалом вивченню СКБД у вузах приділяється небагато уваги та зазвичай вона концентрується на основних поняттях і якомусь діалекті SQL, що в принципі правильно, якщо метою є дати базову підготовку по якнайширшому колу предметів. Але в роки моєї студентської юності, коли вчорашні випускники приходили на виробництво (тоді ще не казали «приходили в бізнес», бо в СРСР бізнесу не було), їм казали: «Забудьте усе, чому вас вчили у вузі (слова „виш“ тоді ще також не існувало), на виробництві все по-іншому». Але зараз чи то освіта стала ближчою до життя, чи життя адаптується до освіти, тому вчорашні випускники вишів часто не виходять за рамки того, чому їх навчили, якщо це можливо і їм цього вистачає для виконання завдань. Не знаю, це добре чи погано.

Але життя йде вперед разом з СКБД, і підтримка мов програмування інших, ніж SQL, надавала базам даних широкі можливості, серед яких — інтегрування більшої частини або і всього ЕТЛ-процесу всередину БД. В якійсь із версій SQL Server 6.x (1995-96 рр.) з’явилися Extended Stored Procedures, які надавали можливість писати процедури на C/C++, компілювати їх в DLL і потім викликати з T-SQL. В якій саме версії, знайти пряме посилання на документацію Microsoft не вдалося, лише непрямі, тут і тут, і згадування файлів opends60.dll і opends60.lib в сучасній документації по Extended Stored Procedures. В Oracle у версії 8.0 (червень 1997-го) з’явилась підтримка зовнішніх збережених процедур на C, у версії 8.1.5 (1998 рік) — на Java. Та й пакети PL/SQL мали стільки можливостей, що іншим СКБД залишалось тільки заздрити. Але в SQL Server 2005 з’явився SQL CLR, що відкрило доступ зсередини SQL Server, хоча і зі значними обмеженнями, до можливостей .Net Framework, та підвищило конкурентноспроможність SQL Server в порівнянні з Oracle.

Через обмежені можливості SQL не втрачає популярність так звана трирівнева архітектура (як підвипадок N-рівневої), згідно з якою система має складатися з трьох рівнів — рівня презентації (presentation tier) — простіше кажучи, інтерфейс користувача, рівня застосунку (application tier), також відомого як рівень логіки або середній рівень, та рівня даних (data tier). З рівнем презентації все просто — це вебсторінка або десктопна програма.

Про рівні застосунку та даних гарно сказано тут:

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

Рівень застосунку зазвичай розробляється за допомогою Python, Java, Perl, PHP або Ruby та взаємодіє з рівнем даних за допомогою викликів API.

Рівень даних, який іноді називають рівнем бази даних, рівнем доступу до даних або серверною частиною, — це місце, де зберігається та керується інформація, що обробляється програмою. Це може бути реляційна система керування базами даних, така як PostgreSQL, MySQL, MariaDB, Oracle, Db2, Informix або Microsoft SQL Server, або NoSQL-сервер бази даних, такий як Cassandra, CouchDB або MongoDB.

Постає питання: які елементи або дії реалізувати на рівні застосунку, а які на рівні даних? З однієї сторони, багатство можливостей мов високого рівня дозволяє легше розробляти складні системи. З іншої, сучасні програми працюють все з більшими об’ємами даних і реалізовувати бізнес-логіку за межами сервера БД з його ресурсами та можливостями оптимізації інколи стає дуже непросто.

І тут сягає думка: а навіщо мені для бізнес-логіки обробляти дані на рівні/сервері застосунку, якщо у мене СКБД «розуміє» C#, Java, Python etc?

Далі я хочу коротко описати, які мови можна використати «всередині» Transact-SQL Microsoft SQL Server (не забуваємо, що Transact-SQL ще використовується в продуктах Sybase, але описаних нижче можливостей у них, звісно, немає).

Існують три технології, крім Extended Stored Procedures (які все ще використовуються, але вже об’явлені Microsoft як deprecated), які дозволяють використовувати не SQL мови . Вірніше, чотири. В SQL Server Integration Services є компоненти Script Task та Script Component, в яких використовується C# чи VB.Net і пакети з ними можна запускати з Transact-SQL, якщо, наприклад, вони розміщені в SSIS Catalog. Але тут ми його розглядати не будемо, це, на мою думку, скоріше тема для статті по SSIS.

SQL CLR

SQL CLR або SQLCLR (SQL Common Language Runtime) — це технологія для розміщення загального середовища виконання Microsoft .NET (Common Language Runtime) у середовищі SQL Server. Вона дозволяє керованому коду розміщуватися та виконуватися в середовищі бази даних як звичайним об’єктам SQL.

Згідно з документацією теоретично ми можемо написати об’єкт (процедуру, функцію, тригер, тип даних тощо) на будь-якій .Net мові. Практично це просто зробити лише на C# і VB.Net, особливо у Visual Studio, створивши необхідні об’єкти в Database проєкті й просто через Publish згенерувавши SQL-скрипт для завантаження або напряму завантаживши проєкт в базу даних. Visual Studio також згенерує в скрипті або створить на сервері усі необхідні об’єкти-обгортки на Transact-SQL. Або можна використати скомпільований файл проєкту (.dacpac) і утіліту SqlPackage.

З .Net-мовами, відмінними від C# чи VB.Net, буде трішки важче. Потрібно буде вручну компілювати збірку, і писати або генерувати скрипти для обгорток кожного об’єкту. Загальні кроки по деплою коротко описані тут. В інтернеті подекуди трапляються приклади для F#, а от для інших мов я не зустрічав.

SQL Server Agent

SQL Server Agent — це планувальник завдань SQL Server. Його згадую тому, що там є чудова опція — тексти кроків можна писати на PowerShell. Коротко все описано тут.

Це прекрасна можливість використовувати все багатство функціоналу .Net без обмежень SQL CLR, та, в принципі, і без знання .Net. Командлети PowerShell покривають величезну купу задач в найрізноманітніших областях.

В інтернеті є багато прикладів, де в SQL Server Agent PowerShell скрипт запускається через cmd.exe, але ці приклади невдалі. Думаю, зручніше, коли ми працюємо з текстом PowerShell скрипта прямо з SSMS або іншого засобу розробки/адміністрування, в одному середовищі з кодом T-SQL.

External scripts

В SQL Server 2016 з’явився новий функціонал — SQL Server R Services. Він дозволяє запускати скрипти на R через процедуру sp_execute_external_script.

Слід сказати, що Microsoft доволі багато вклалася в розвиток мови R. У 2015 році Microsoft поглинула компанію Revolution Analytics (американська компанія, виробник програмного забезпечення для статистичної обробки, що фокусувалася на комерціалізації мови програмування R та створення програмних рішень з його використанням), після чого провела ребрендинг деяких їх розробок.

Варто згадати найбільш значимі внески в розвиток екосистеми R: Microsoft R Open (безкоштовна, покращена версія базового R), Microsoft R Server (переросла в Machine Learning Server з підтримкою Python, оптимізовані версії R для роботи з великими даними, що виходять за межі оперативної пам’яті, паралельне та розподілене виконання обчислень), інтеграція R у SQL Server, розширені бібліотеки для масштабованої аналітики (RevoScaleR, microsoftml, olapR), власний репозиторій Microsoft R Application Network (MRAN) як дзеркало відомого всім, хто працює з R, Comprehensive R Archive Network (CRAN), проте більш впорядкований.

Але, як то кажуть, «не злетіло», і Microsoft заявив про припинення підтримки Machine Learning Server (R Server) і MRAN, проте підтримка R в SQL Server не припиняється.

В SQL Server 2017 замість SQL Server R Services з’являється SQL Server Machine Learning Services з підтримкою Python, в SQL Server 2019 додано підтримку Java. З Java є особливість: вона «заходить» в SQL Server 2019 не через SQL Server Machine Learning Services, як R чи Python, а через SQL Server Language Extensions і потребує додаткових кроків для налаштування. І на відміну від R та Python, розширення Java не містить додаткових бібліотек машинного навчання — це радше інтеграція загального призначення.

В 2021 році Microsoft представила мовне розширення C# Language Extension, яке дозволяє виконувати C# код без обмежень SQL CLR як зовнішній скрипт, за аналогією з R, Python та Java. Тут можна подивитись порівняння можливостей SQL Server Language Extensions та SQL CLR.
Процедура sp_execute_external_script дозволяє виконати зовнішній скрипт (на R, Python, Java, C# та інших мовах, зареєстрованих через CREATE EXTERNAL LANGUAGE) ізсередини SQL Server, при необхідності отримуючи дані з T-SQL у вигляді скалярних параметрів та/або датасету і повертаючи результат (також як скалярні змінні чи датасет) назад у T-SQL.

Вхідний датасет передається як текст SQL-запиту, результат якого конвертується «всередині» скрипта в DataFrame-подібну структуру (data.frame в R, pandas.DataFrame у Python, власний DataFrame у C# extension). На виході також можна отримати датасет подібно до виводу звичайної процедури.

І, нарешті, хочу сказати, що код SQL Server Language Extensions відкритий, доступний в GitHub, і ви його можете використати, щоб інтегрувати в SQL Server вашу улюблену мову (Julia, Rust тощо) за аналогією з іншими мовами для зовнішніх скриптів.

Щасти вам!

P.S. Метою даної статті я ставив не тільки вказати на маловикористовувані можливості Microsoft SQL Server, а й ініціювати дискусію щодо доцільності їх використання для реалізації бізнес-логіки не на стороні клієнтської частини, а в базі даних. Як я згадував, у мене були такі випадки, коли архітектура системи реалізувалась, виходячи з наявних спеціалістів одного напряму (C#, Python etc) і браку інших (DB Engineer, DB Developer etc). Бо якось у багатьох Project Manager-ів, а часто й у розробників ще панує уявлення, що бази даних — це тільки таблиці.

Буду вдячний за коментарі та виправлення помилок та неточностей!

І трішки гумору!

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Дуже цікава думка! З точки зору теорії — усе так: MS послідовно нарощує можливості SQL Server. З точки зору практики — усе навпаки: від важких SQL процедур та бізнес-логіки в базі послідовно переходять на ORM та навіть на NO SQL.
Головною проблемою MS SQL Server була проблема масштабування: одна база могла жити тільки на одному сервері. Тому саме база була «вузьким місцем» будь-якої архітектури. І саме тому базу намагалися максимально «розвантажити» переходячи на 3-tier архітектуру і впроваджуючи кешування.
База — це головна проблема ентерпрайз систем. Аби забезпечувати транзакційність, консістенці та актуальність даних — усе має лежати в одній базі. Спроби будувати системи з декількома базами, реплікацією та розподіленими транзакціями як правило закінчуються жахливим перфомансом та дедлоками. А оскільки одна база означала один фізичний сервер — то для великих систем цей сервер мав бути по-справжньому потужним. MS навіть створила спеціальну версію Windows: Datacenter edition. Вона підтримувала максимальну кількість процесорів на одному сервері — тобто «вертикальне масштабування». Наскільки мені відомо «горизонтальне масштабування» бази не підтримувалося.
Але навіть найпотужніше залізо має свої обмеження. І коли у одну базу лізуть десятки тисяч онлайн юзерів одночасно — то сама архітектура SQL Server буде призводити до розростання блокувань і неминучих дедлоків.
З мого досвіду на великих ентерпрайз проєктах сиділи суворі ДБА, які слідкували за усіма скриптами, які надсилав рівень бізнес-логіки. Ніяких курсорів, тимчасових таблиць, SQL функцій чи сторед процедур вони у базі не дозволяли! Більше того: запит з OUTER JOIN мав великі шанси не пройти код ревью. Бо на обсягах таблиць у мільярди записів один необережний ORDER BY чи LOOP JOIN могли просто «покласти» сервер.
Отже практика застосування SQL Server була цілком протилежна описаному у статті:
SQL Server має використовуватися тільки для довгострокового зберігання даних. Усе що можна зробити «не в базі» — має робитися де-інде. Особливо — величезні запити, які збирають данні по купі таблиць. Для цього є багато рішень: Data Warehouse, read-only репліка бази, вивантаження даних у NO SQL бази, кешування усюди, де можливо. В ідеалі операції з базою мають бути по-перше атомарні (ніяких транзакцій на 10 таблиць), по-друге асинхронні з підтримкою обробки дедлоків і повторних спроб. Хорошою практикою вважалося використання CQRS та Event Sourcing бо це дозволяє поставити оновлення даних у базі у чергу і уникнути десятків тисяч одночасних апдейтів.
З часом почала набувати популярності мікросервісна архітектура. І деякі навіть наважувалися перейти від єдиної монолітної бази до eventual consistency та підходу коли кожен мікросервіс сам зберігає свої данні. Ось в такому випадку — якщо маємо невелику базу, тоді можна справді усю функціональність мікросервіса побудувати «всередині» SQL Server: від бізнес-логіки до API. Але чи буде це економічно? SQL Server не дешеве задоволення, а якщо даних небагато то мікро-сервісу не обов’язкове таке важке і коштовне рішення.
Я думаю що хмари доволі сильно підірвали позиції СУБД. В умовах одночасної роботи десятків тисяч юзерів з усього світу дотримання ACID означає поганий перфоманс і конфлікти транзакцій. А відмова від ACID — робить важкі СУБД непотрібними.

Головною проблемою MS SQL Server була проблема масштабування: одна база могла жити тільки на одному сервері.

Это проблема ЛЮБОГО сервера бд
Если кто набежит с оракл грид или с, дай бог памяти, как оно там у информикса называлось....
Вот просто возьму и отхерачу канделябром просто по хлебалу.

И да, у скуля были federated databases (а может и до сих пор есть), но за них тоже надо канделябром.

SQL Server має використовуватися тільки для довгострокового зберігання даних.

ві там все охренели что ли? ©
Заведите себе файлопомойку, положите туда csv файлі и храните себе данніе

Особливо — величезні запити, які збирають данні по купі таблиць.

закажу ка я себе дополнительній набор канделябров.

по-друге асинхронні з підтримкою обробки дедлоків і повторних спроб.

как у увас «асинзронность» вяжется с ретрайами? как тёплое с мягким?

І деякі навіть наважувалися перейти від єдиної монолітної бази до eventual consistency

чтоб вам так бабло на карте учитывали ©

SQL Server не дешеве задоволення,

SQL Server Express Edition is free — Microsoft provides it at no cost, even for commercial use
Softkey.ua lists SQL Server 2022 Standard Edition (full server license, not per-core) at 51 521.40 грн.

дотримання ACID означає поганий перфоманс і конфлікти транзакцій. А відмова від ACID — робить важкі СУБД непотрібними.

ну и правильно, на*** ацид!
правда, если нету ацида, то то что ві используете єто не РСУБД, но оно вам и не надо, я так понимаю

если нету ацида, то то что ві используете єто не РСУБД, но оно вам и не надо, я так понимаю

Насправді так і виходить! Я бачив багато великих ентерпрайз проєктів. На усіх база була вузьким місцем. На усіх щось вигадували аби покращити перфоманс і уникнути дедлоків. Найбільш популярними підходами було:
1) Заборонити відкривати транзакції (тобто явно begin transaction).
2) Використовувати NoLock чи явно Dirty Read
Чого я не бачив майже ніде: перевірки версій і вирішення конфліктів. Як правило підхід «хто останній — той і тато» використовувався майже усюди. Тобто якщо один озер узяв запис 10 хвилин тому, поки він пив каву цю запис ще 10 юзерів поміняли ... то після того, як перший юзер збереже свою запис — він перепише і відмінить усі чужі зміни! Тепер додаємо що транзакцій нема а отже кожна таблиця апдейтиться окремо — і бачимо що увесь ACID просто іде відомим шляхом.
Тому останнім часом просто визнали очевидне: ACID майже нікому і не треба! А це означає що більше не треба важких РСУБД, а можна використовувати NO SQL чи Event Sourcing.
За часів коли інформація глобальна і у хмарах, сама концепція існування та підтримки єдиної (на увесь світ!) актуальної версії даних стає утопічною. Не можна залочити увесь світ поки хтось один міняє данні — а отже треба змиритися що одночасно в клауді можуть існувати декілька версій тих самих даних — і розуміти як вирішувати конфлікти між ними.

Насправді так і виходить!

ну и слава богу, разбрались
В топике по обсуждению РСУБД пришли к выводу что РСУБД не нужны, прям кобыла с возу — бабе легче

Найбільш популярними підходами було:
1) Заборонити відкривати транзакції (тобто явно begin transaction).
2) Використовувати NoLock чи явно Dirty Read

Блядь! Простите, был напуган
Ни сколько не сомневаюсь. В конце концов решили: РСУБД вообще не нужны, правильно?

і бачимо що увесь ACID просто іде відомим шляхом.

А вы не совсем понимаете что такое «ацид», да?
Ну и ладно, зачем оно вам, только голову забивать

Тому останнім часом просто визнали очевидне: ACID майже нікому і не треба!

Конечно!

А це означає що більше не треба важких РСУБД, а можна використовувати NO SQL чи Event Sourcing.

Разумеется!

За часів коли інформація глобальна і у хмарах, сама концепція існування та підтримки єдиної (на увесь світ!) актуальної версії даних стає утопічною.

П****ц.....

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

Тому — різні юзери та квоти. Тоді якийсь «лівий» запит «покладе» тільки себе — буде виконуватись годинами у рамках своєї квоти ресурсів.

дискусію щодо реалізації бізнес-логіки не на стороні клієнтської частини, а в базі даних

А хіба тут є про що дискутувати? Як на мене — це очевидно кожному, хто має більш-менш тривалий досвід розробки з використанням бд. Хоча б для того, що б зменшити об’еми даних, що передаються мережею. Join таблиць бд на стороні клієнтського застосунку — це окрема пісня. Автор цього допису реалізовував навіть чисельні методи на PL/SQL.

частіше роблять якраз навпаки

Так, таке дійсно є, в тому числі на моєму поточному місці роботи тенденція саме така. Як тільки це станеться — піду шукати роботу в іншому місці.

А хіба тут є про що дискутувати? Як на мене — це очевидно кожному, хто має більш-менш тривалий досвід розробки з використанням бд

Вообще говоря — нихрена тут никому ничего не очевидно
Выбор, где реализовывать бизнес-логику это довольно сложная штука, и кажды раз приходится решать — где и как что делать
и у каждого подхода есть свои плюсы и минусы
по итогу выигрывает комбинированный метод, при котором часть логики на сервере, часть на клиенте (не тот клиент, который ЮАЙ/Терминал), а тот клиент, который апп сервер. но даже в этом случае есть много нюансов.

Автор цього допису реалізовував навіть чисельні методи на PL/SQL

На этом месте все должны восхититься или что?

восхититься

— Ким або чим? Власне ця фраза була про можливості мов бд. Вони багато-чого дозволяють реалізовувати.

Численные методы в большинстве случаев достаточно тривиально реализовываются любым императивным языком, равно как и переписываются с одного на другой. Поэтому это ваше «НАВІТЬ ЧИСЕЛЬНІ МЕТОДИ» вызывает некоторое удивление.

Коротше, топік створений для збору коментарів. Нічого нового нам автор не розповів, просто сказано, що молотком можна не тільки цвяхи забивати, а й цвяхами можна цей же молоток забивати — то й добре, як комусь так подобається і гроші за це платять — чому б і ні? Потрібно думати ширше, як то кажуть, out of the box.

Існують три технології, які дозволяють використовувати не SQL мови.

А еще есть extended stored procedure, которые никак не покрыты в статье.

Так, дійсно, про них зовсім забув. Вибачаюсь!

Дякую, додав згадку про extended stored procedures

Було б непогано якби ви привели приклади «навіщо».
Особливо якщо є якісь реальні кейси написання/перенесення подібної логіки в SQL.
Бо (з мого досвіду) частіше роблять якраз навпаки і якраз від егідою «легше підтримувати та масштабувати»

Ну, от, наприклад, придумав таку жартівливу історію.

Компанія розробляє і підтримує якусь фінансову систему. На початок кожного дня потрібні курси валют. Задача тривіальна, DB інженер написав скрипт на PowerShell або SQL+Python, вставив його в SQL Server Agent або інший скедулер в СКБД, запускається в 09:00, з API Нацбанку бере курси валют, вставляє в таблицю, робить валідацію. Потрібні якісь зміни в коді — просто відредагував SQL чи PowerShell скрипт. В разі фейлу є лог з помилками. В 10:00 інша джоба перевіряє, чи є дані і чи валідні вони. Налаштована нотифікація від обох джобів. Тобто весь процес від отримання даних із зовнішнього джерела до зберігання в базі знаходиться в одному місці і в зоні відповідальності однієї людини (умовно) — DB інженера.
Одного дня PM каже: «Робимо мухи окремо, котлети окремо. База даних у нас тільки для зберігання даних. Як сказав Роберт Мартін, база даних — це лише дверна ручка в архітектурі будинку». Ок, зробили окремий сервіс на окремому сервері або додали цей функціонал в існуючий. Все добре. Підтримує все це адмін Вася.

І якось в чаті з адмінами:

10:01.
— Привіт! Васю, немає курсів валют!
— Ой, та ми вчора міняли паролі до системних екаунтів, зараз подивлюсь!
Іншого дня
10:01.
— Привіт! Васю, немає курсів валют!
— Ой, та ми вчора задеплоїли нову версію, зараз подивлюсь!
Іншого дня
10:01.
— Привіт! Васю, немає курсів валют!
— Ой, та ми вчора переїхали на новий сервер, зараз подивлюсь!
Іншого дня
10:01.
— Привіт! Васю, немає курсів валют!
— Ой, та там у них помінявся формат респонса, зараз буду шукати розробника Колю, який буде шукати код, написаний розробником Сашею, який звільнився рік тому. Коля внесе зміни, збілдить проект і задеплоїть!
Іншого дня
10:01.
— Привіт! Васю, немає курсів валют!
— Ой, а Вася звільнився, це адмін Діма, мені потрібно кілька днів, щоб розібратись, як тут у Васі все було налаштовано!
Думаю, що попередня структура без ланки «адмін Вася» була краща.

DB інженер написав скрипт на PowerShell або SQL+Python, вставив його в SQL Server Agent або інший скедулер в СКБД, запускається в 09:00, з API Нацбанку бере курси валют

Т.е. у вас с сервера БД идут исходящие запросы куда-либо во внешний мир? Интересно.

В 10:00 інша джоба перевіряє, чи є дані і чи валідні вони.

А почему это не могла сделать первая?

— Ой, а Вася звільнився, це адмін Діма, мені потрібно кілька днів, щоб розібратись, як тут у Васі все було налаштовано!

ну, DB-инженер то точно ж не уволится.

Т.е. у вас с сервера БД идут исходящие запросы куда-либо во внешний мир? Интересно.

Ага! Веб-реквести.

А почему это не могла сделать первая?

Та може. Це я щоб створити інтригу))
А насправді, щоб відділити логіку, яка ходить у зовнішній світ, від логіки, яка живе у базі

ну, DB-инженер то точно ж не уволится.

Та да))
Або його наступник точно знатиме, що All You Need Is LoveDatabase.

Хтось пояснить, як мати код на базі врятує від зміни формату респонсу чи переїзду на інший сервер?

чат жопа ті залюбки пояснить будь шо

Я оце запитав у ChatGPT, які мови підтримуються в основних СКБД.
У відповіді є неточності, та нехай.
І думаю, а для чого Microsoft та Oracle вкладають гроші і час у підтримку всього цього?
Може, вони не в курсі, що це все непотрібно?


  • SQL Server
    • Основна: T-SQL
    • Інші офіційні всередині: .NET CLR (C#, VB.NET, F#)
    • Через розширення / інтеграції: R, Python (Machine Learning Services)

  • Oracle
    • Основна: PL/SQL
    • Інші офіційні всередині: Java (вбудована JVM), C/C++ (extproc), .NET (на Windows)
    • Через розширення / інтеграції: Python, R, Julia (Oracle ML), JavaScript (через JVM)

  • PostgreSQL
    • Основна: PL/pgSQL
    • Інші офіційні всередині: PL/Perl, PL/Python, PL/Tcl, PL/Java
    • Через розширення / інтеграції: C (UDF) та багато інших через PL Handler (Ruby, R, Lua, Julia)

  • MySQL
    • Основна: Procedural SQL (Stored Programs)
    • Інші офіційні всередині: немає (короткий запис: — )
    • Через розширення / інтеграції: C/C++ (UDF), зовнішні виклики до Python/Java/PHP через сторонні рішення
Microsoft

колись вкладався у Silverlight і VB.NET і шо ?
апеляція до авторитету — слабкий аргумент

Якщо я щось, що роблять інші люди, не розумію, то виникає 2 версії: або я чогось не знаю, або вони. Наприклад, йду по вулиці, робітники риють канаву. По моїх даних, тут ніяких комунікацій не повинно бути. Тобто, або в мене неповні дані, або в них. Але ж вони працюють в спеціалізованій службі, напевно, у них більше інформації.
Так і тут, або Microsoft, Oracle, всі розробники опенсорсного PostgreSQL чогось не знають, або ви.

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

Щось я не бачу тут питання

колись вкладався у Silverlight і VB.NET і шо ?
апеляція до авторитету — слабкий аргумент

Чи оце воно?

і шо ?
Я оце запитав у ChatGPT

І отут стає остаточно зрозуміло чому ця стаття utter trash

Як з усім майкрософт від цього л-на намагаються здихатись на всіх серйозних бізнесах. На майсіквел, постгрес, оракл, дб2, авс куди завгодно аби не воно.

працював колись в банку де абсолютно вся бізнес-логіка була в бд, це жесть)))
думаю зараз таку єресь вже ніхто і не зробить 🤓

ініціювати дискусію щодо доцільності їх використання для реалізації бізнес-логіки не на стороні клієнтської частини, а в базі даних

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

Я дуже багато бачив легасі систем де хтось таки вкрутив це щастя. Розбирати потім як воно працює був той ще біль. Clr в ms sql створює купу складностей в плані безпеки. Треба або підписувати .net assembly або підразовувати хеш та вносити його як довірений перед деплоєм в базу. Ще можуть бути нюанси якщо потрібно використовувати такі сервіси як RDS від AWS. Якщо вже вмієте писати код, то може не варто його пхати в субд та й можливостей transact sql на справді дуже багато.

Логику в БД есть смысл держать, когда это оправдано с точки зрения производительности (какая-нибудь массовая обработка данных, которые гонять туда-сюда накладно). И в этом случае, впрочем, скорее всего SQL CLR и прочие описанные в статье методы будут хуже обычного T-SQL.
ИМХО, разумеется.

GPT: CLR в SQL Server — это штука, которая на бумаге выглядит круто, но в реальной разработке её почти никто не использует из-за проблем с поддержкой.. =))

Дебажить CLR внутри SQL крайне неудобно.
Подключение VS Debugger к SQL — это боль и возня с правами.
В продакшене часто DBA запрещают CLR по политике безопасности (потому что UNSAFE-ассембли может получить доступ к файловой системе, сети и т.д.).

Поэтому чаще рациональнее забирать данные в приложение и там обрабатывать — по сути мертвая фича

Все це вірно, SQL CLR вже скоріше legacy технологія, але деяких випадках все ще має сенс її використовувати.
От що каже ChatGPT, і я з ним згоден:

1. Складна обробка рядків
Регулярні вирази (Regex) для пошуку або заміни тексту.
T-SQL не має повноцінних регулярних виразів, а CLR дозволяє використовувати .NET System.Text.RegularExpressions.
Приклад: пошук та витяг підрядків у великих текстових полях без масивних T-SQL конструкцій.

2. Криптографія
Хешування, шифрування/розшифрування даних.
SQL Server має вбудовані функції (HASHBYTES, EncryptByKey), але для складних алгоритмів або нестандартних форматів часто використовують CLR.

3. Обробка XML/JSON
Якщо потрібно виконати складну навігацію по XML/JSON або трансформацію, CLR може працювати швидше і зручніше, ніж через T-SQL або XQuery.

4. Математичні та статистичні обчислення
Наприклад, тригонометрія, чисельні методи, лінійна алгебра.
CLR дозволяє використовувати .NET бібліотеки (Math.NET, чисельні алгоритми), що інколи значно швидше за T-SQL.

5. Інтеграція з зовнішніми API
Наприклад, виклики веб-сервісів або обробка специфічних даних у форматах, які складно обробляти в чистому SQL.
Це одна з рідкісних, але реальних причин використання CLR у деяких проєктах.

Сам використовував для регулярних виразів, обробки xml і виклику API.

Нагадаю вам цитату дядька Боба. База даних — це лише деталь. Висновки робіть самостійно

А щодо Роберта Мартіна — так з ним багато хто не згоден
journal.optivem.com/...​-database-is-not-a-detail

Отут також добре описано, чому база даних — не дверна ручка
medium.com/...​-is-a-detail-eda7424e8ce2

Окей, як потім цю логіку скейлити якщо один інстанс не тягне ?

От, наприклад, ви навчаєте свою нейронку на Pandas датафреймах.
Даних побільшало, не вистачає пам’яті, додаєте.
Через деякий час знову невистачає пам’яті, додаєте.
Коли вам це набридне, плюєте на все, розгортаєте кластер Spark і переробляєте весь свій код, написаний непомірним трудом, під PySpark.
Тобто, підбирайте правильну архітектуру — оцінюйте можливі перспективи щодо об’єму даних, мережевого навантаження, вартості тощо.
Для одних рішень бізнес-логіка в SQL Server підійде, для інших ні.
На жаль, в SQL Server тільки вертикальний скейлінг.

От, наприклад, ви навчаєте свою нейронку на Pandas датафреймах.

Pandas/PySpark бібліотекм/фреймворки для препоцессінгу данних, практично вони не використовуються і не оптимізовані для навчання нейромереж.
Sql server як і будь яка рсубд не має практичних можливостей використання для бізнесс логіки і близько співставних з application layer — а для querying/persisting данних тільки. Для бізнесс логіки, що зі скейлом , що без — практично правильним є використання тільки application layer.

Ну, хотілося б якісь аргументи, кейси, аналіз, приклади щодо

практично правильним є використання тільки application layer

.
А то звучить щось на кшалт «Учение Маркса всесильно, потому что оно верно»

Для одних рішень бізнес-логіка в SQL Server підійде, для інших ні.

я не можу поки знайти приклади де це взагалі підійде окрім стародавнього легасі де сторед процедури це просто рудимент

Окей, як потім цю логіку скейлити якщо один інстанс не тягне ?

как правило если «один инстанс не тянет», то єто в 80% случаев говорит о ручках из жопки.

Хотів би я подивитися як один інстанс скл мені потягне хоча б 10к рпс cpu bound роботи коли у мене база ще (нагадаю) паралельно кверяє дані з таблиць
Я звісно розумію що в українських реаліях середній проект це важка внутрішня єрпіха де на швидкість і availability взагалі можна класти з прибором але щось я не бачив у проектах на скейлі щоб був скл тим паче логіка усередині бази

один інстанс скл мені потягне хоча б 10к рпс cpu bound роботи коли у мене база ще (нагадаю) паралельно кверяє дані з таблиць

Не дуже зрозуміло на рахунок приписів після 10k rps, але і postres, і mysql можуть в рази більше rps видавати якщо ще прості oltp запити. Звісно що це не про olap, але там інші бази і великий проект то про зоопарк технологій, та вже свої абстракції над базовими технологіями, один сервер реально не витягне сотні тищ rps.

www.uber.com/...​en-ES/blog/mysql-at-uber

blog.bytebytego.com/...​pify-manages-its-petabyte

Виходить що я не згоден як і з паном Oleksii Kovalov’им так з вами :)
Тобто знаю на практиці що один інстанс в проді може тримати 50к rps нескладних olap запитів, але є системи де цього недостатньо, або зазвичай треба репортінг по сотням мільонів записів і там вже інші підходи, та технології.

Звісно що це не про olap,

в ОЛАП не бівает «тісяч запросов в секунду»

Хотів би я подивитися як один інстанс скл мені потягне хоча б 10к рпс cpu bound роботи коли у мене база ще (нагадаю) паралельно кверяє дані з таблиць

не до конца понял архитектуру.
что значит «база паралельно кверяет данніе с таблиці»?
Мі же вроде бі как раз о производительности БД речь ведём?
как єто вообще «база кверяет данніе»?
Єто же приложение «кверяет данніе»?

Ну от наприклад я написав скрипти які виконуються на базі як пише автор. Там важка cpu bound робота, бо у мене ж база може і так і сяк робити і криптографію і процесити файли ітд. Ще паралельно на ту базу йдуть запити на звичайну вичитку або запис даних. Коли у мене будуть впиратися ресурси у один інстанс бо все ж таки скл бази під диск оптимізовані і цпу під соточку піде як мене врятують «прямі руки» коли у мене фізично не буде можливості скейлитися ?

бо у мене ж база може і так і сяк робити і криптографію і процесити файли ітд

Ну сами себе злобный буратино, что я могу сказать
а крипту у вас база не майнит? Изображения не распознаёт? нейронки не тренирует? Нету? А что ж вы так то?

як мене врятують «прямі руки»

Если бы у вас были прямые руки — вы бы не решали задачи, не предназначенные для решгения сервером баз данных — при помощи сервера баз данных.

Повертаючись до мого оригінального комента — як мені скейлити виконання скриптів на базі (тематика статті), ви мені написали про «прямоту рук», до чого ваш коментар був тоді якщо як виявляється що це задачі «не призначені для бд» ?

Повертаючись до мого оригінального комента — як мені скейлити виконання скриптів на базі (тематика статті), ви мені написали про «прямоту рук», до чого ваш коментар був тоді якщо як виявляється що це задачі «не призначені для бд» ?

Основной проблемой инженерии состоит в том, что люди чинят вещи, которіе в принципе не должны существовать
Я там ничего чуть более подробно уже отвечал, но отвечу также и тут
Нет, НЕ НУЖНО нагружать сервер баз данных несвойственными ему задачами
ДА, вам ДАЛИ ВОЗМОЖНОСТЬ выстрелить себе в ногу. Но даже имея такую ВОЗМОЖНОСТЬ — не делайте этого
Возможность выполнения некоего кода из БД следует воспринимать как приятную возможность облегчить себе жизнь, а не как «а я тогда ВСЁ буду делать так».
НЕ НАДО так.
НЕ НАДО искать проблем и потом вопрошать «а как мне теперь решать эту проблему?»

Або ви працювали на проектах з нормальним навантаженням

Або ви працювали на проектах з нормальним навантаженням

Не уверен что полностью понял вашу місль

Вважається, що найбільш cost effective мати одну ноду бази якомога довше і для 99.99% проектів цього достатньо. Навіть важкі по cpu процеси можна наспавнити в кілька інстансів апки, які стукатимуться в один інстанс бази. Це те, що, скоріше за все, один з підходів, який ви маєте на увазі під «прямими руками». Але цей спосіб вам недоступний, якщо ви виконуєте код на базі, як написано в статті. Але навіть, якщо ви так зробили, все одно цей підхід має свої обмеження, хоч і досить високі. І проекти з таким навантаженням — це не завжди faang, в Україні теж є кілька таких

Але цей спосіб вам недоступний, якщо ви виконуєте код на базі, як написано в статті

Зависит от.
я вообще не особо понял — что именно афтор предлагает выполнять при помощи того же clr
Идея же перенести бизнес логику внутрь сервера, но в виде clr, а не в виде хранимых процедур.... ну, она, грубо говоря, крайне порочна.
crl с моей точки зрения нужен для реализации «псевдо-системных функций», которые нужны для работы, но трудно/плохо реализуемы при помощи стандартного скл. Как пример — регулярные выражения. крайне полезны именно на стороне скуля, сложно реализуемы на т-скл, легко реализуемы на c# (но надо следить за прожорливостью)

Підписатись на коментарі