Към съдържанието
wannacode

OLTP и OLAP

Накратко: OLTP са многото малки заявки на едно приложение, като касата, а OLAP са малкото големи заявки на отчетите, които четат всички редове.

Проблем

Касата и счетоводството

Базата на магазина върши две много различни работи наведнъж. Клиентът на касата пита за една поръчка и иска отговор веднага. Собственикът в понеделник сутрин пита „колко продадохме по месеци и по категории“, и за това трябват всички поръчки от годината.

Първите са хиляди на минута, малки и по ключ. Вторите са няколко на ден, но всяка чете всичко. Една и съща база рядко е добра и в двете. Затова съществуват различни видове бази, и този модул е за тях.

Идеята

OLTP: много малки заявки

OLTP (online transaction processing) е работата на касата: прочети или промени няколко реда, които знаеш по ключ. Продуктите в поръчка 42:

SQLбаза: магазин

Планът показва, че базата не чете цялата таблица. Тя търси (SEARCH) по индекса на първичния ключ и стига направо до двата реда:

SQLбаза: магазин

OLTP заявките и пишат. Покупката е една транзакция: поръчката, редът в нея и наличността се записват заедно или изобщо не се записват:

SQLбаза: магазин

Пробвай

Клиентът пита

Клиентът се обажда за поръчка 15. Покажи статуса и датата ѝ (колони status и ordered_at).

SQLбаза: магазин

Идеята

OLAP: малко големи заявки

OLAP (online analytical processing) е работата на анализа: да събереш, групирай и сравни много редове. Оборотът по месеци за 2026 година:

SQLбаза: магазин

Тук ключ не помага. Трябват всички редове на поръчките, затова планът започва със SCAN:

SQLбаза: магазин

При 152 реда това е мигновено. При 50 милиона реда отчетът чете гигабайти и минути наред натоварва диска, паметта и процесора. През това време касата чака. А индекс не помага, защото отчетът така или иначе иска всичко.

Идеята

Складът за данни

Решението е отчетите да не пипат базата на сайта. Всяка нощ програма копира данните в отделна база за анализи, наречена склад за данни (data warehouse). Копирането се казва ETL: extract (извади), transform (преобразувай), load (зареди).

При преобразуването таблиците обикновено се сливат в една широка: всичко за една продажба в един ред. Това е денормализация, която в базата на сайта би била грешка: името на продукта се повтаря във всеки ред. Тук е нарочно, защото данните само се четат и отчетът няма нужда от JOIN. CREATE TABLE … AS SELECT прави нова таблица от резултата на заявка:

SQLбаза: магазин

Отменените поръчки са махнати още при копирането, така че отчетите не трябва да помнят за тях.

По-точно, за любопитните

Истинските складове за данни (ClickHouse, BigQuery, Snowflake, Amazon Redshift) пазят данните по колони, а не по редове. Отчет за оборота чете само колоните day, category и amount и прескача останалите. За това е урокът за колонните бази. Широката таблица обикновено е „таблица на фактите“ (fact table) с малки таблици-речници около нея (измерения: дата, продукт, магазин), и цялото се нарича звездна схема.

Пробвай

Отчет по категории

От таблицата sales: оборотът по категории за 2026 година (колони category и revenue, закръглен до цент), от най-голямия надолу.

SQLбаза: магазин

Упражнение

Колко поръчки по градове

От таблицата sales: колко поръчки има от всеки град (колони city и orders), от най-много надолу, при равни по име на града. Клиент без град е ред с NULL.

SQLбаза: магазин

Идеята

Видът на данните и видът на въпроса

OLTP и OLAP са първото разделение. Останалите идват от това какви са данните и какво питаш за тях. Всеки урок в модула е една такава двойка, и в повечето има симулатор на истинската база в браузъра:

Данните и въпросът Вид база Примери
Взимам по ключ, бързо, често key-value Redis, Valkey, DynamoDB
Цял документ с вложени части документна MongoDB
Какво се е случило и в какъв ред поток от събития Kafka, Redpanda
Кой с кого е свързан, през колко стъпки графова Neo4j
Суми върху милиони редове, по време колонна, времеви редове ClickHouse, TimescaleDB
Думи в текст пълнотекстово търсене Elasticsearch, OpenSearch
Подобно по смисъл векторна pgvector, Qdrant
Повече данни и заявки от един сървър клъстер репликация, шардинг

Накрая е урокът как се избира. Отговорът почти винаги е: релационна база за истината и друг вид до нея само за въпроса, в който тя е слаба.

Тест

Провери се

1. Кое е OLTP заявка?
2. В широката таблица sales всеки ред е един продукт от поръчка. Как се броят поръчките?
3. Защо отчетите обикновено не се пускат върху базата, на която работи сайтът?

Създаден от Иво Гергов като част от кампанията на Evo Tech за достъпно обучение по програмиране ·