Analitik soraglary optimizirlemek
1) Näme üçin optimizirlemek (iGaming konteksti)
Iş tizligi: GGR/NET hasabatlary, üpjün edijiler/oýunlar, RG/AML we p95 SLA-da marketing.
Bahasy: az skanirlenýän baýt we şafla → aşakda $/haýyş.
Ygtybarlylyk: durnukly iň ýokary sagat, BI "aýazlarynyň" ýoklugy.
Masştab: onlarça marka/bazar, milliardlarça setirler, minutlar täzelik.
2) Ýük profili we SLO
Soraglaryň "ilkinji 90%" -ini düşündiriň: penjireler (7/28/90d), süzgüçler ('brand, country, provider, psp, status'), join's, JSON atributlary, top K we burç.
SLO mysallar: p95 ≤ 1. 2 s daşbord üçin, scanned bytes ≤ 256 MW/haýyş, freshness ≤ 5 min.
3) Meýilnamalaryň anatomiýasy: näme gözlemeli
Predicate/Projection pushdown: süzgüçler we sütünleriň sanawy çeşmä düşýär.
Partition pruning & data skipping: goşmaça partiýa/faýllary bölmek (min-max/bloom/manifest).
Vectorized scan/late materialization: JOIN/PROJECT tarapyndan yza süýşürilen sütünleri okamak.
Join strategy: Broadcast Hash (BHJ), Sort-Merge (SMJ), Nested Loop (NLJ — избегать).
Spill & shuffle: SLA-nyň esasy duşmanydyr.
Adaptive query execution: Kärendede strategiýany üýtgetmek (BHJ SMJ geçiş, dinamiki koalits).
Meýilnama: näçe baýt okaýandygymyzy, nirede şaflam edýändigimizi, nämäni kesýändigimizi görkezmelidir.
4) Partiýa, sortlama, klaster-keys
Partisiýa: 'date' + 1-2 giriş ölçegleri (mysal üçin 'brand, country').
Sortlamak/toplamak: 'ORDER BY/CLUSTER BY/Z-order' ýygy-ýygydan süzgüçler/joinler boýunça ('provider, game_id, occurred_at').
Reklasterizasiýa we kompaksiýa: data skipping üçin yzygiderli göçürme; maksatly faýl ululygy 128-1024 MB.
5) JOIN-patternleri
Broadcast Hash Join (BHJ): kiçijik ölçeg (≤ ýüzlerçe MB) → hakykata broadcast.
sql
/ hint if engine supports/
SELECT /+ BROADCAST(dim_provider) /...
Sort-Merge Join (SMJ): uly toplumlar, gabat gelýän esasy sortlar/klaster-mysallar → iň az şafl.
Pre-join/denormalizasiýa: "dim _" -den hakyky surata (projection/materialized view) durnukly atributlary çykaryň - möhüm ýolda minus JOIN.
Anti/semijoins: 'NOT IN/EXISTS' -ni aç-açan semi-/anti-join meýilnamalaryna täzeden ýazyň.
Kardinal partlamany ýok etmek: ölçeglerdäki açarlaryň dublikatlaryny barlaň, surrogate-keys ulanyň.
6) GROUP BY, agregatlar we deslapky agregasiýalar
Rollup/Cube/Grouping Sets: Birnäçe agregasiýanyň ýerine bir faza.
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));
Materiallaşdyrylan pikirler (MV )/proýeksiýalar: 'payments _ 7d _ by _ brand _ psp', 'rounds _ 1d _ by _ provider _ game'.
Partial → Final aggregation: hereketlendirijini bölekleýin workerlerde (local) we ahyrky koordinatorda birleşdirmäge rugsat beriň.
Approximate: HLL for 'COUNT (DISTINCT user)', TDigest for percentile - has arzan we BI üçin ýeterlik.
7) Penjire funksiýalary (seresaplylyk bilen)
PARTITION BY ýokary saýlama açarlar boýunça; ORDER BY - sütünli sortlar boýunça.
Agyr penjireleri mümkin boldugyça predagregatlar we semi-joins bilen çalyşyň.
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) Süzgüçler, paginasiýa we TOP-K
Süzgüçleriň tertibi CBO üçin möhüm däl, ýöne saýlama we indeksler/sortlamak möhümdir.
LIMIT … WITH TIES/APPROX TOP-K - skany gysgaldýarlar.
Paginasiýa: 'OFFSET/LIMIT' ýerine 'keyset pagination'.
sql
-- keyset
SELECT FROM t WHERE (date, id) > (:last_date,:last_id) ORDER BY date, id LIMIT 1000;
9) JSON/ýarym gurluş
Sütünlere barýan gyzgyn ýollary materiallaşdyryň ('device. os`, `psp. method`).
Hereketlendiriji goldaýan bolsa, JSON ýollarynda ters indeksleri/GIN ulanyň.
Setirlerde UDF-den gaça duruň: atributlary saýlamak bilen has gowy proýeksiýa.
10) Approx we sampler
HLL/Theta Sketch: arzan 'COUNT DISTINCT'.
TDigest/KLL: p95/p99 doly sort.
Reservoir/stratified sampling: interaktiw gözleg we preview.
11) Ýat, bogazy we konkarrensi
Spill-guard: join/agg üçin ýat çäkleri; dökülende - batch/parallelismi azaldyň, açar boýunça sortlamany artdyryň.
Concurrency & QoS: "gyzgyn" daşbordlar we agyr ad-hoc üçin howuzlar; skan/wagt çäkleri; "unudylan" soraglara kill-switch.
Result cache/query cache: gaýtalanýan BI şablonlary açyň, täzelik belligi boýunça maýyp boluň.
12) Regressiýanyň we "goşa geçmegiň" synaglary
Top-N soraglary üçin salgylanma profillerini (meýilnama/skan-baýt/wagt) saklaň.
Indeksleri/klasterleri çykarmazdan ozal - A/B geçişi: p95, scanned bytes, skipped share, shuffle.
"Fil-fast" bosagasyny dörediň: p95 össe> X% - yza gaýdyň.
13) Synlamak we SLO
SLI:- p50/p95/p99 latency, scanned bytes/query, skipped bytes %, files touched;
- shuffle bytes, spilled bytes, peak memory;
- cache hit-rate; accuracy approx-agregatlar.
Aladalar: scanned bytes, skipped paýyň düşmegi, ýygy-ýygydan NLJ, bogazy> bosagasy.
14) iGaming halatlary (reseptler)
14. 1 Tölegler/PSP: "şowsuzlyklaryň iň ýokary derejesi"
WHERE: `ts BETWEEN now()-7d AND now()`, `brand,country,psp,status`.
Partiýa: day; ORDER/Z-order: `(brand,country,ts)`; bitmap: `psp,status`; bloom: `transaction_id`.
MV: `payments_7d_by_brand_psp(status)`.
Netije: p95 → ~ 1s, scanned bytes ↓ 5-10 ×, nol bogazy.
14. 2 Oýun tapgyrlary: Top-K oýunlary/sagat
ORDER BY / cluster по `(provider, game_id, occurred_at)`; Pre-agregatlar üçin projection.
Approx Top-K + TDigest p95 tapgyryň dowamlylygy üçin.
Jemleýji: gyzgyn keşde subsentrik grafikler.
14. 3 RG/AML: işjeň çäklendirmeler
JSON 'reason' → sütün; bitmap `rg_state`, `kyc_level`; semi-join iň soňky ýagdaýy bilen.
Netije: "30 gün üçin" hasabat - sekuntda, doly skansyz.
15) Optimizirlemegiň çek-sanawy (gündelik)
1. Top-N haýyşlary we olaryň profillerini ýygnamak (meýilnama/baýt/şafl).
2. Partisiýa senesi boýunça + ylalaşylan sortlama/klaster-hadysalar.
3. pushdown we projection pruning barlagy (diňe zerur sütünler).
4. JOIN-strategiýasy: kiçi broadcast, SMJ üçin sortlamak, NLJ ýok.
5. Gyzgyn daşbordlar üçin öňünden agregasiýa/MV.
6. Approx (distinct/percentiles/top-k).
7. JSON → sütünler we/ýa-da ters indeksler.
8. Kompaksiýa/reklasterizasiýa; skipped bytes maksady ≥ 70%.
9. Netijeleri kesmek we konkarrensi howuzlary.
10. Gözegçilik: p95, scanned bytes, shuffle, spill, hit-rate.
16) Şablonlar (ulanmaga taýýar)
16. 1 Optimizasiýa syýasaty (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 Soragyň regressiýa synagy (psevdo-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 täzeden ýazmak
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 Keýset-paginasiýa
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) Anti-patternler
'SELECT' prodda; projection pruning ýoklugy.
Millionlarça setirde OFFSET paginasiýasy.
COUNT DISTINCT eskizsiz; doly sort.
Uly toplumlarda NLJ; JSON sözleri boýunça join.
Ownuk bölekler we bölünen faýllar (meta-maglumatlar tupany).
Sütünleri materiallaşdyrmagyň ýerine, WHERE-de UDF setirleri.
Ignor statistik/ANALYZE - kör optimizator we full scan.
Regression synaglaryň we yza gaýdyp geliş çäkleriniň ýoklugy.
18) Durmuşa geçirmegiň ýol kartasy
0-30 gün (MVP)
1. Top-N soraglaryny ölçemek we SLO/SLI gurmak.
2. Sortlamak senesi/klaster-mysallar boýunça partiýa; data skipping/bloom.
3. Tölegler boýunça "gyzgyn" hasabat üçin bir MV; HLL/TDigest в BI.
4. Gözleg howuzlaryny bölmek, result cache goşmak.
30-90 gün
1. Agyr penjireleriň sanalmagy/JSON → agregasiýadan öňki/sütün.
2. Kiçi ölçegli Broadcast-join; Uly üçin SMJ; NLJ-ni ýok etmek.
3. Meýilnama boýunça kompaksiýa we reklasterizasiýa; Açar maslahatçysy.
4. Syn edilmegi we pese gaçmagyň töwekgelçiligi, A/B meýilnamalary, awto-yza gaýdyp gelmek.
3-6 aý
1. / MV proýeksiýa katalogy we SLA.
2. Approx-ýadro distinct/percentile/top-k üçin ähli daşbordlar boýunça.
3. Regress-synaglaryň we býudjetleriň bitewi şablonlary $/haýyş.
4. JSON we UDF hemişelik arassaçylygy: materiallaşma we indeksler.
19) RACI
Data Platform (R): partiýa/klaster/kompaksiýa, MV/proýeksiýa, nagt pul, gözegçilik.
Analytics/BI (R): SQL täzeden ýazmak, approx-agregatlar, regressiýa synaglary.
Domain Owners (C): Kesmek we takyklyk talaplary.
Howpsuzlyk/DPO (A/R): Gizlinlik/PII, agregatlaryň k-anonimligi.
SRE/Observability (C): SLO/alerting, konkarrensi we kapasiti.
Maliýe (C): $/haýyş üçin býudjetler we ykdysady täsir.
20) Baglanyşykly bölümler
Analitik ammarlaryň indeksasiýasy, Maglumat shemalary we olaryň ewolýusiýasy, Maglumatlary tassyklamak, DataOps-praktikalary, Maglumatlary toparlaşdyrmak, Ölçegleriň peselmegi, API analitikleri we metrikleri, MLOps: modelleriň işleýşi.
Jemi
Soraglary optimizirlemek "jadyly hint" däl-de, ulgam: maglumatlary başarnykly bellemek (partisiýa/klaster), deslapky agregasiýa we approximate-algoritmler, dogry JOIN strategiýalary, nagt pul/konkarrensi we p95 we scanned bytes yzygiderli gözegçilik etmek. iGaming üçin bu SLA we býudjetiň çäginde tölegleriň, oýunlaryň we gabat gelmegiň çalt we durnukly ölçeglerini aňladýar.