Коротше кажучи, я погодився б із вашим CTO. Ви, мабуть, отримали певні показники за рахунок масштабованості (якщо ці умови заплутані, я уточню нижче). Мої дві найбільші турботи - це ремонтопридатність та відсутність варіантів масштабування горизонтально (якщо припустити, що вам це знадобиться).
Близькість до даних: Давайте зробимо крок назад. Для введення коду в БД є кілька вагомих причин. Я б заперечував, що найбільшим буде близькість до даних - наприклад, якщо ви очікуєте, що підрахунок поверне кілька значень, але це сукупності мільйонів записів, що надсилають мільйони записів (на запит) мережа, яка має бути об’єднана в інших місцях, є дуже марною і може легко вбити вашу систему. Сказавши це, ви могли досягти такої близькості даних іншими способами, по суті, використовуючи кеші або БД аналізу, де частина агрегації виконується заздалегідь.
Виконання коду в БД:Ефекти вторинної продуктивності, такі як "кешування планів виконання", складніше сперечатися. Іноді кешовані плани виконання можуть бути дуже негативною справою, якщо кешований неправильний план виконання був кешований. Залежно від ваших RDBMS, ви можете отримати максимум користі з них, але ви не отримаєте багато над параметризованим SQL, в більшості випадків (ці плани, як правило, також кешуються). Я б також заперечував, що більшість мовою, що складений або JIT'ed, як правило, працюють краще, ніж їх еквіваленти SQL (наприклад, T-SQL або PL / SQL) для основних операцій та нереляційного програмування (обробка рядків, циклі тощо), тому ви б не хотіли Ви нічого там не втрачаєте, якщо ви використовували щось на кшталт Java або C #, щоб зробити число хрускотом. Дрібнозерниста оптимізація також досить складна - у БД, ви ' часто застрягають із загальним B-деревом (індексом) як вашою єдиною структурою даних. Якщо чесно, то повний аналіз, включаючи такі речі, як тривалі операції, ескалація блокування тощо, може заповнити книги.
Ремонтопридатність: SQL - чудова мова для того, що він був розроблений. Я не впевнений, що це чудово підходить для логіки додатків. Більшість інструментів та практик, які роблять наше життя нестерпним (TDD, рефакторинг тощо), важко застосувати до програмування баз даних.
Продуктивність та масштабованість:Щоб уточнити ці терміни, я маю на увазі це: продуктивність - це те, наскільки швидко ви очікували, що один запит пройде через вашу систему (і повернеться до користувача), на даний момент припускаючи низьке навантаження. Це часто обмежується такими речами, як кількість фізичних шарів, через які він проходить, наскільки добре оптимізовані ці шари тощо. Масштабованість - це те, як продуктивність змінюється зі збільшенням кількості користувачів / завантаження. У вас може бути середня / низька продуктивність (скажімо, 5 секунд + для запиту), але дивовижна масштабованість (здатна підтримати мільйони користувачів). У вашому випадку ви, мабуть, матимете хороші показники, але ваша масштабованість буде обмежена тим, наскільки великий сервер ви можете фізично створити. В якийсь момент ви досягнете цієї межі і будете змушені звертатися до таких речей, як заточування, що може бути неможливим в залежності від характеру програми.
Передчасна оптимізація. Зрештою, я думаю, ви помилилися передчасно. Як зазначали інші, у вас насправді немає вимірювань, які б показували, як працюватимуть інші підходи. Ну, ми не завжди можемо створити повномасштабні прототипи, щоб довести або спростувати теорію ... Але загалом я б завжди вагався, обравши підхід, який торгує ремонтопридатністю (можливо, найважливішою якістю програми) для продуктивності .
EDIT: З позитивної ноти, вертикальне масштабування може розтягнутися в деяких випадках досить далеко. Наскільки мені відомо, SO досить довго працював на одному сервері. Я не впевнений, як це відповідає вашим 10 000 користувачам (я думаю, це залежало б від характеру того, що вони роблять у вашій системі), але це дає вам уявлення про те, що можна зробити (насправді, є далеко Більш вражаючі приклади, це просто трапляється популярним, який люди легко зрозуміють).
EDIT 2: Щоб уточнити та прокоментувати декілька речей, викладених в інших місцях:
- Re: Атомна консистенція - консистенція кислотних кислот цілком може бути вимогою системи. Вищезазначене насправді не сперечається з цим, і ви повинні усвідомити, що послідовність ACID не вимагає від вас керувати усією діловою логікою всередині БД. Переміщаючи код, який не повинен бути там у БД, ви обмежуєте його працювати у фізичному середовищі решти БД - він змагається за ті ж апаратні ресурси, що і фактична частина управління вашою БД. Що стосується масштабування лише коду на інших серверах БД (але не фактичних даних) - звичайно, це можливо , але що саме ви тут отримуєте, крім додаткових витрат на ліцензування у більшості випадків? Зберігайте речі, які не повинні бути в БД, поза БД.
- Re: продуктивність SQL / C # - оскільки це, здається, цікавить тему, давайте додамо трохи до дискусії. Ви, звичайно, можете запускати рідний / Java / C # код всередині БД, але, наскільки я знаю, це не те, про що йшлося тут - ми порівнюємо реалізацію типового коду програми у чомусь на зразок T-SQL порівняно з чимось на зразок C #. Існує ряд проблем, які важко було вирішити з реляційним кодом в минулому - наприклад, розгляньте проблему "максимально одночасних входів", де у вас є записи, що вказують на вхід або вихід, і час, і вам потрібно розробити максимальна кількість користувачів, які входили в будь-який час, була. Найпростішим можливим рішенням є перегляд записів і зберігання збільшення / зменшення лічильника під час зустрічі входу / виходу та відстеження максимуму цього значення.може, Я не знаю), найкраще, що ти можеш зробити, це КУРСОР (суто реляційні рішення є різними порядками складності, а спроба вирішити це за допомогою циклу в той час призводить до гіршої продуктивності). У цьому випадку так, рішення C # насправді швидше, ніж ви можете досягти в T-SQL, період. Це може здатися надуманим, але ця проблема може легко проявитися у фінансових системах, якщо ви працюєте з рядками, що представляють відносні зміни, і вам потрібно обчислити віконні агрегації на них. Збережені виклики процедур також вигідніші - викликайте тривіальний SP мільйон разів і подивіться, як це порівнювати з викликом функції C #. Я натякнув на кілька інших прикладів вище - я ще не стикався з тим, щоб хтось реалізував належну таблицю хешів у T-SQL (той, який насправді дає певні переваги), хоча це досить легко зробити в C #. Знову ж таки, є речі, в яких БД дивовижні, і речі, в яких вони не такі приголомшливі. Так само, як я не хотів би робити JOIN, SUM та GROUP BY в C #, я не хочу писати нічого, особливо інтенсивного процесора в T-SQL.