Оптимизатсияи дархостҳои таҳлилӣ
1) Чаро оптимизатсия кардан (контексти IGaming)
Суръати тиҷорат: Ҳисоботҳои GGR/NET, провайдерҳо/бозиҳо, RG/AML ва маркетинг дар p95 SLA.
Арзиш: байтҳои камтар сканшуда ва shafl → аз $/дархост.
Эътимоднокӣ: соатҳои қуллаи устувор, BI ях намекунад.
Миқёс: Даҳҳо брендҳо/бозорҳо, миллиардҳо хатҳо, дақиқаҳои тару тоза.
2) Профили сарборӣ ва SLO
"90% аввалини" дархостҳоро тавсиф кунед: тирезаҳо (7/28/90d), филтрҳо ('бренд, кишвар, провайдер, psp, status'), атрибутҳои JSON, боло K ва фоизҳо.
Намунаҳои SLO: p95 ≤ 1. 2 с барои панели, байтҳои сканшуда ≤ 256 МБ/дархост, тару тоза ≤ 5 дақ.
3) Анатомияи нақшаҳо: чиро бояд ҷустуҷӯ кард
Pushdown пешгӯӣ/пешгӯӣ - Филтрҳо ва рӯйхати сутунҳо ба манбаъ партофта мешаванд.
Навдаи қисмҳо ва партофтани маълумот (min-max/bloom/manifest).
Сканкунии векторӣ/материализатсияи дер: сутун аз ҷониби JOIN/PROJECT мавқуф гузошта шудааст.
Стратегияи ҳамроҳ: Broadcast Hash (BHJ), Sort-Merge (SMJ), Nested Loop (NLJ - избегать).
Spill & shuffle: Ҳаҷми омехта ва рехтан ба диск душмани асосии SLA мебошад.
Иҷрои дархости мутобиқшавӣ: тағир додани стратегия дар вақти корӣ (BHJ↔SMJ гузариш, коалҳои динамикӣ).
Нақша бояд нишон диҳад: мо чанд байт мехонем, шафлим куҷост, мо чӣ кэш мекунем.
4) Тарафҳо, навъбандӣ, ҳолатҳои кластерӣ
Тарафҳо: аз рӯи 'сана' + 1-2 андозаи дастрасӣ (масалан, 'бренд, кишвар').
Гурӯҳбандӣ/кластерӣ: 'Фармоиш аз рӯи/CLUSTER BY/Z-фармоиш' аз ҷониби филтрҳо/пайвастҳои зуд-зуд ('провайдер, game_id, occurred_at').
Таснифот ва фишурдасозӣ: интиқоли мунтазам барои партофтани маълумот; Андозаи файли мақсаднок 128-1024 МБ мебошад.
5) Намунаҳои ҳамроҳ
Broadcast Hash Join (BHJ): андозаи хурд (≤ садҳо МБ) → пахши воқеӣ.
sql
/ hint if engine supports/
SELECT /+ BROADCAST(dim_provider) /...
Ҳамроҳшавии Sort-Merge (SMJ): маҷмӯаҳои калон, навъбандии калидҳо/кластерҳои мувофиқ → чоҳи ҳадди аққал.
Пеш аз пайвастшавӣ/denormalization: гузарондани хусусиятҳои устувор аз 'хира _' ба лаҳзаи воқеӣ (дурнамо/назари моддӣ) - минуси ҳамроҳ шудан ба роҳи интиқодӣ.
Анти/semijoins: аз нав сабт кардани 'NOT/EXISTS' ба нақшаҳои возеҳи нимсола/зидди ҳамроҳ.
Бартараф кардани таркиши куллӣ: калидҳои нусхабардории андозаҳоро санҷед, калидҳои суррогатиро истифода баред.
6) ГУРӮҲ АЗ РӮИ, агрегатҳо ва прегрегатсияҳо
Маҷмӯаҳои Rollup/Cube/Grouping: як марҳила ба ҷои якчанд маҷмӯа.
sql
SELECT brand, country, DATE(ts) d, SUM(amount)
FROM gold. payments
WHERE ts >= NOW() - INTERVAL '7 days'
GROUP BY GROUPING SETS ((brand,country,d),(brand,d),(d));
Назари материализатсияшуда (MV )/пешгӯиҳо: 'пардохтҳо _ 7d _ by _ brand _ psp', 'rounds _ 1d _ by _ provider _ game'.
Қисман → Ҷамъбасти ниҳоӣ: имкон диҳед, ки муҳаррик қисман ба коргарон (маҳаллӣ) ва дар ниҳоят ба координатор муттаҳид карда шавад.
Тахминан: HLL барои 'COUNT (корбари DISTICT)', TD 'iest барои фоизҳо - якчанд маротиба арзонтар ва барои BI кофӣ аст.
7) Функсияҳои тиреза (тозагӣ)
ҚИСМАТ АЗ РӮИ тугмаҳо бо интихоби баланд; Фармоиш аз рӯи - аз рӯи навъбандии сутун.
Дар ҷойҳои имконпазир тирезаҳои вазнинро бо preaggregates ва нимпайкараҳо иваз кунед.
sql
-- Instead of window distinct
SELECT brand, COUNT() users
FROM (SELECT DISTINCT brand, user_id FROM gold. sessions WHERE d>=CURRENT_DATE-7) t
GROUP BY brand;
8) Филтрҳо, саҳифабандӣ ва TOP-K
Тартиби филтр барои CBO муҳим нест, аммо интихоб ва индексатсия/навъбандӣ мебошанд.
МАҲДУДИЯТ... БО TIES/REACX TOP-K - сканро кӯтоҳ кунед.
Пагинатсия: 'pagination keyset' ба ҷои 'OFFSET/LIMIT' барои ҷадвалҳои калон.
sql
-- keyset
SELECT FROM t WHERE (date, id) > (:last_date,:last_id) ORDER BY date, id LIMIT 1000;
9) JSON/Нимсохторӣ
Ҷобаҷогузории роҳҳои гарм ба сутунҳо ('дастгоҳ. os ',' psp. усул ').
Агар муҳаррик дастгирӣ кунад, индексҳои баръакс/GIN-ро дар роҳҳои JSON истифода баред.
Аз хатти UDF канорагирӣ кунед: дурнамои беҳтар бо хусусиятҳои равшаншуда.
10) Тақрибан ва интихоб
Эскизи HLL/Theta: Арзони 'COUNT DISTICT'.
TD iest/KLL: фоизҳо p95/p99 бидуни навъи пурра.
Интихоби обанбор/стратификатсияшуда: таҳқиқоти интерактивӣ ва пешнамоиш.
11) Хотира, тангӣ ва мувофиқат
Муҳофизаткунанда: маҳдудиятҳои хотира оид ба ҳамроҳ/agg; ҳангоми рехтан - партия/параллелизмро кам кунед, навъбандиро аз рӯи калид зиёд кунед.
Ҳамоҳангсозӣ ва QOS: ҳавзҳо барои панелҳои "гарм" ва ҷаҳаннами вазнин; скан/маҳдудияти вақт; куштан-гузариш ба дархостҳои "фаромӯшшуда".
Кэши кэш/дархости натиҷа: барои қолибҳои такрории BI фаъол кунед, бо аломати тару тоза хомӯш кунед.
12) Санҷишҳои регрессия ва "давиши дукарата"
Нигоҳ доштани профилҳои истинод (нақша/скан байт/вақт) барои дархостҳои боло N.
Пеш аз баровардани индексатсияҳо/кластерҳо - A/B иҷро: муқоиса кунед p95, байтҳои сканшуда, ҳиссаи партофташуда, омехта.
Сохтани ҳудудҳои "номуваффақ-тез": агар p95 боло равад> X% - бознишастагӣ.
13) Мушоҳида ва SLO
SLI:- p50/p95/p99 дермонӣ, байтҳо/дархостҳои сканшуда, байтҳои партофташуда%, файлҳо ламс карда шуданд;
- байтҳои омехта, байтҳои рехта, хотираи қулла;
- хит-меъёри кэш; равиши дақиқ-агрегатҳо.
Огоҳиҳо: болоравии байтҳои сканшуда, афтодани ҳиссаи партофташуда, зуд-зуд NLJ, рехтан> ҳудудҳо.
14) Ҳолатҳои бозӣ (аз меъ-)
14. 1 Пардохт/PSP: "қуллаҳои радкунӣ"
ДАР куҷо: 'ts now () -7D now ()', 'бренд, кишвар, psp, status'.
Ҳизб: рӯз; Фармоиш/Z-фармоиш: '(бренд, кишвар, ts)'; bitmap: 'psp, status'; балоғат: 'транзаксия _ ид'.
MV: 'пардохтҳо _ 7d _ by _ brand _ psp (ҳолат)'.
Натиҷа: p95 → ~ 1s, байтҳои сканшуда ↓ 5-10 ×, тангии сифр.
14. 2 Даври бозӣ: Бозиҳои Top K/Соат
Фармоиш аз рӯи/кластер po '(провайдер, game_id, occurred_at)'; дурнамо барои preaggregates.
Тақрибан Top-K + TD iest барои давомнокии даври p95.
Сатри поён: графикҳои зер-сония дар кэши гарм.
14. Маҳдудиятҳои фаъоли 3 RG/AML
JSON 'reason' → сутун; bitmap 'rg _ state', 'kyc _ level'; нимтайёр бо ҳолати охирин.
Натиҷа: гузориш "барои 30 рӯз" - сонияҳо, бе сканкунии пурра.
15) Рӯйхати санҷиши оптимизатсия (ҳамарӯза)
1. Ҷамъоварии дархостҳои боло N ва профилҳои онҳо (нақша/байт/шафл).
2. Маҷмӯаҳо аз рӯи сана + ҳолатҳои мувофиқашудаи навъбандӣ/кластерӣ.
3. Санҷиши буридани pushdown ва проексия (танҳо сутунҳои зарурӣ).
4. Стратегияи ҳамроҳ: пахши хурд, навъ барои SMJ, NLJ.
5. Пеш аз агрегатсия/MV барои панелҳои гарм.
6. Тақрибан дар ҷое ки эътибор дорад (фарқият/фоизҳо/top-k).
7. JSON → сутунҳо ва/ё индексатсияҳои баръакс.
8. Фишурдасозӣ/таснифот; ҳадафи байтҳои партофташуда ≥ 70%.
9. Натиҷаҳо кэш ва ҳавзҳои ҳамбастагии алоҳида.
10. Мониторинг: p95, байтҳои сканшуда, омезиш, рехтан, зарба.
16) Қолибҳо (барои истифода омодаанд)
16. 1 Сиёсати оптимизатсия (YAML)
yaml workload: bi_hot slo:
p95_latency_ms: 1200 scanned_bytes_max_mb: 256 skipped_bytes_share_min: 0. 70 storage:
partition_by: ["date"]
cluster_by: ["brand","country","occurred_at"]
indexes:
bloom: ["transaction_id","user_surrogate_id"]
bitmap: ["psp","status","rg_state"]
aggregation:
mv:
- name: mv_payments_7d_brand_psp window: "7d"
group_by: ["brand","psp","status"]
approx:
count_distinct: "hll"
percentile: "tdigest"
concurrency:
pools: {bi_hot: 50, adhoc: 10}
timeout_s: 120
16. 2 Санҷиши регрессияи дархостҳо (псевдо-SQL)
sql
-- baseline: p95<=1200ms, scanned_bytes<=256MB
EXPLAIN ANALYZE
SELECT brand, psp, status, COUNT() cnt, SUM(amount) amt
FROM gold. payments
WHERE ts >= NOW() - INTERVAL '7 days'
AND brand =:brand AND country =:country
GROUP BY brand, psp, status;
16. 3 Навиштани DISTINCT
sql
-- Bad: Heavy COUNT (DISTINCT user_id)
SELECT COUNT(DISTINCT user_id) FROM gold. sessions WHERE d>=CURRENT_DATE-7;
-- Better: HLL sketch/preaggregate
SELECT hll_union(user_hll) FROM agg. sessions_7d_user_hll WHERE d>=CURRENT_DATE-7;
16. 4 Саҳифаҳои калидӣ
sql
SELECT
FROM gold. game_rounds
WHERE (occurred_at, round_id) > (:ts,:rid)
AND brand=:brand AND country=:country
ORDER BY occurred_at, round_id
LIMIT 1000;
17) Анти-намунаҳо
'SELECT' in prod; набудани навдаро пешгӯӣ.
Саҳифаи OFFSET дар миллионҳо хатҳо.
Ҳисоб кардани фарқият бе эскизҳо; фоизҳо тавассути навъи пурра.
NLJ дар маҷмӯаҳои калон; ҳамроҳ бо ибораҳои JSON.
Маҷмӯаҳои хурд ва файлҳои пароканда (тӯфони метамаълумот).
Сатрҳои UDF дар КУҶО ба ҷои материализатсия кардани сутунҳо.
Оморро нодида гиред/ANALIZE - оптимизатори нобино ва сканкунии пурра.
Не озмоишҳои регрессия ва на ҳадди ақалли бозгашт.
18) Харитаи роҳсозӣ
0-30 рӯз (MVP)
1. Андозагирии дархостҳои боло N ва насби SLO/SLI.
2. Маҷмӯаҳо аз рӯи сана + навъбандӣ/кластер; имкон медиҳад, ки партофтани маълумот/балоғат.
3. Як MV барои як ҳисоботи пардохти гарм; HLL/TD jiest в BI.
4. Тақсим кардани ҳавзҳои дархост, имкон диҳед кэши натиҷа.
30-90 рӯз
1. Барӯйхатгирии тирезаҳои вазнин/JSON → preaggregation/сутунҳо.
2. Пахш-ҳамроҳ кардани андозаҳои хурд; SMJ барои калон; барҳам додани NLJ.
3. Ҷадвали фишурдасозӣ ва таснифот; Мушовири асосӣ.
4. Мушоҳида ва огоҳиҳои таназзул, нақшаҳои A/B, худкор.
3-6 моҳ
1. Каталоги дурнамо/MV бо версия ва SLA.
2. Тақрибан ядро барои фарқият/фоизӣ/боло-к дар ҳама панелҳо.
3. Қолабҳои ягона барои санҷишҳои регрессия ва буҷетҳо $/дархост.
4. Гигиенаи доимии JSON ва UDF: амалисозӣ ва нишондиҳандаҳо.
19) RACI
Платформаи маълумот (R): қисмҳо/кластерӣ/фишурдасозӣ, MV/пешгӯиҳо, кэшҳо, мониторинг.
Аналитика/BI (R): навиштани SQL, агрегатҳои тақрибан, санҷишҳои регрессия.
Соҳибони домейн (C): талабот ба бахшҳо ва дақиқӣ.
Амният/DPO (A/R): махфият/PII, k-беном будани агрегатҳо.
SRE/Мушоҳида (C): SLO/ҳушдор, мувофиқат ва қобилият.
Молия (C): буҷаҳо барои $/дархост ва таъсири иқтисодӣ.
20) Қисматҳои марбут
Индексатсияи нигаҳдории таҳлилӣ, схемаҳои маълумот ва эволютсия, тасдиқи маълумот, амалияи маълумот, кластери маълумот, кам кардани андоза, таҳлил ва ченакҳои API, MLOps: Истифодаи моделҳо.
Ҷамъ
Оптимизатсияи дархостҳо "ишораи сеҳрнок" нест, балки система: бақайдгирии салоҳиятноки маълумот (қисмҳо/кластерҳо), алгоритмҳои пешакӣ ва тахминӣ, стратегияҳои дурусти JOIN, кэш/ҳамоҳангӣ ва мониторинги доимии p95 ва байтҳои сканшуда. Барои IGaming, ин маънои ченакҳои зуд ва устувор барои пардохтҳо, бозиҳо ва мутобиқатро дар доираи SLA ва буҷа дорад.