GH GambleHub

Վերլուծական հարցումների օպտիմիզացումը

1) Ինչու՞ օպտիմիզացնել (iGaming ենթատեքստը)

Բիզնես արագությունը 'GGR/NET, պրովայդերներ/խաղեր, RG/AML և մարքեթինգը p95 SLA-ում։

Արժեքը 'ավելի քիչ սկանավորված բայթ և շաֆլան ավելի ցածր է, քան դոլարը/հարցումը։

Մոսկվա 'կայուն պիկ ժամացույց, BI «սառեցման» բացակայություն։

Մասշտաբը 'տասնյակ բրենդեր/շուկաներ, միլիարդավոր տողեր, թարմության րոպե։

2) Բեռի և SLO-ի պրոֆիլը

Գրեք հարցումների «առաջին 90 տոկոսը» 'պատուհանները (7/28/90d), ֆիլտրերը («brand, country, provider, provider, pro, status»), Join' a, JSON ատրիբուտները, լավագույն K-ը և փետուրները։

SLO օրինակներ ՝ p95 241։ 2 s dashbord, scanned bytes 24256 MV/հարցում, freshness 245 min։

3) Ծրագրերի անատոմիա 'ինչ փնտրել

Disdicate/Project pushdown: Ֆիլտրերը և սյուների ցանկը իջնում են աղբյուրին։

Parterpruning & www.skiping: ավելցուկ կուսակցությունների/ֆայլերի (min-max/bloom/manifest)։

Vectorized scan/late materialization: Կարդացեք JOIN/PROJC-ի հետաձգված սյուների վրա։

Join strategy: Broadcast Hash (BHJ), Sort-Merge (SMJ), Nested Loop (NLJ — избегать).

Spill & shuffle: Discove-ը SLA-ի գլխավոր թշնամին է։

Adaptive query execution: ռազմավարության փոփոխությունը rantaime-ում (BHJ-ի տեղափոխումը SMJ, դինամիկ կոալեսը)։

Պլանը պետք է ցույց տա, թե որքան բայթ ենք կարդում, որտեղ շաֆլիմ ենք կարդում, որ քեշիրուն ենք։

4) Կուսակցություն, տեսակավորում, կլաստեր-քեյս

Կուսակցությունը 'հասանելիության չափման "date' + 1-2 (օրինակ ՝" brand, country ")։

Տեսակավորումը/կլաստերիզացիան '«ORDER BY/CLUSTER BY/Z-order» հաճախակի ֆիլտրերով/ջոնամներով («provider, game _ id, occurred _ at»)։

Գովազդի ստերիզացիա և կոմպակտացիա 'ստացիոնար փոխանցումը ռուսական skipping-ի համար։ 210-1024 ՄԲ ֆայլերի չափսը։

5) JOIN-pattern-ը

Broadcations Hash Join (BHJ) 'փոքրիկ չափումը (4900 ՄԲ) broadcript փաստին։

sql
/ hint if engine supports/
SELECT /+ BROADCAST(dim_provider) /...

Soft-Merge Join (SMJ) 'մեծ հավաքածուներ, որոնք համատեղելի են հիմնական տեսակավորումը/կլաստեր-քեյսը նվազագույն շաֆլ է։

Pre-join/denorizalization: Վերցրեք կայուն ատրիբուտներ '«dection _» -ից փաստի մեջ (project/materialized) - minus JOIN-ը կրիտիկական ուղու վրա։

Anti/semijoins: Գրեք 'MST IN/EXISSA-ը ակնհայտ semi-/anti-join ծրագրերում։

Կարդինալ պայթյունի իրականացումը 'ստուգեք կրկնօրինակները չափումների մեջ, օգտագործեք surrogate-keys։

6) GROUGE BY, ագրեգատներ և նախազգուշացում

Rollup/Cube/Winuping Sets: Մեկ փուլ մի քանի ագրեգատների փոխարեն։

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 )/պրոյեկտները ՝ «payments _ 7d _ by _ by _ port», «rounds _ 1d _ by _ provider _ game»։

Partial medical Final aggregation: Թույլ տվեք շարժիչը միաձուլել մասամբ վորկերների վրա (ental) և վերջնական կոորդինատորի վրա։

Approximate: HMS-ը 'COUNT-ի համար (DISTINCT user), TDigest-ը պերցենտիլների համար շատ ավելի էժան է և բավարար է BI-ի համար։

7) Պատուհանի գործառույթները (ուշադիր)

PARTIM BY-ն հավասար է բարձր ընտրության բաների։ ORDER BY-ը հսկայական տեսակավորման մեջ է։

Փոխարինեք ծանր պատուհանները նախնական և semi-joins, որտեղ հնարավոր է։

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-ի համար, բայց կարևոր է ընտրության և ինդեքսների/տեսակավորման համար։

LIMIT … WITH TIES/APROX TOP-K-ն կրճատում է սկանը։

Պագինացիա '"keyset pagination" փոխարեն' MSSET/LIMIT "մեծ աղյուսակների համար։

sql
-- keyset
SELECT FROM t WHERE (date, id) > (:last_date,:last_id) ORDER BY date, id LIMIT 1000;

9) JSON/կես կառուցվածք ունեցող

Նյութականացրեք տաք ճանապարհները սյունակներում ("device. os`, `psp. method`).

Օգտագործեք օգտագործված ինդեքսները/GIN-ը JSON հետքերով, եթե շարժիչը աջակցում է։

Խուսափեք UDF-ից 'ավելի լավ պրոյեկցիաներ, որոնք ունեն ատրիբուտներ։

10) Approx-ը և semprox-ը

HMS/Theta Sketch: Էժան «COUNT DISTINCT»։

TDigest/KMS: p95/p99-ը առանց frons.ru։

Reservoir/stratified sampling: ինտերակտիվ ուսումնասիրություններ և գերազանցություն։

11) Հիշողություն, հիշողություն և concarrency

Spill-guard: Հիշողության սահմանափակումներ join/agg; նեղուցի դեպքում նվազեցրեք batch/parallelism, ավելացրեք տեսակավորումը։

Concurrency & QoS 'puls «տաք» dashbords և ծանր ad-hoc; լիմիտներ սկան/ժամանակ; kill-switch-ը «մոռացված» հարցումների վրա։

Resportcache/query cache: Միացրեք BI ձևանմուշները կրկնելու համար, հաշմանդամ եղեք թարմ հոսքի միջոցով։

12) Ռեգրեսիայի թեստերը և կրկնակի պրոթոնը

Պահպանեք ստանդարտ պրոֆիլները (պլան/սկան-բայթ/ժամանակ) առաջին N հարցումների համար։

Ինդեքսների/կլաստերների թողարկումից առաջ 'A/B-progon: Համեմատեք p95, scanned bytes, skipped to, shuffle։

Դարձրեք «fail-fox» շեմը 'եթե p95 մեծացել է> X տոկոսը' արձագանք։

13) Դիտարկումը և SLO-ն

SLI:
  • p50/p95/p99 latency, scanned bytes/query, skipped bytes %, files touched;
  • shuffle bytes, spilled bytes, peak memory;
  • cache hit-rate; Approx ագրեգատների acuracy aprox։

Alerta: Scanned bytes աճը, skipped-ի նվազումը, NLJ-ի հաճախակի, 24> շեմն է։

14) Քեյսա iGaming (բաղադրատոմսեր)

14. 1 Վճարումներ/PSA: «Մերժումների պիկի»

WHERE: `ts BETWEEN now()-7d AND now()`, `brand,country,psp,status`.
Կուսակցություն ՝ day; ORDER/Z-order: `(brand,country,ts)`; bitmap: `psp,status`; bloom: `transaction_id`.
MV: `payments_7d_by_brand_psp(status)`.

Արդյունքը ՝ p95 241s, scanned bytes-ը 5-10 ռուբլիներ, զրոյական։

14. 2 Խաղային փուլեր ՝ առաջին K խաղեր/ժամ

ORDER BY / cluster по `(provider, game_id, occurred_at)`; project նախաագրեգատների համար։

Approx Top-K + TDigest-ը p95 տևողության համար։

Արդյունքը '2019 վայրկյան գրաֆիկները տաք քեշի վրա։

14. 3 RG/AML ՝ ակտիվ սահմանափակումներ

JSON 'reason' ռուսական սյունակ; bitmap `rg_state`, `kyc_level`; semi-join վերջին վիճակով։

Արդյունքը '«30 օրվա ընթացքում» զեկույցը վայրկյաններ է, առանց fronscan։

15) Օպտիմիզացման թուղթ (ամենօրյա)

1. Լավագույն N հարցումների հավաքումը և դրանց իրականացումը (պլան/բայթ/շաֆլ)։

2. Կուսակցությունները + աշխատանքային տեսակավորում/կլաստեր-կետեր։

3. Pushdown և project pruning (միայն անհրաժեշտ սյուները)։

4. JOIN ռազմավարություն 'broadcript փոքր, SMJ-ի համար տեսակավորում, չկա NLJ։

5. Նախածննդյան/MV տաք dashbords համար։

6. Approx-ը այնտեղ, որտեղ թույլատրելի է (distinct/percentiles/top-k)։

7. JSON-ը պարունակում է սյուներ և/կամ ինովացված ինդեքսներ։

8. Կոմպակտիա/գովազդացում; skipped bytes-ի նպատակը 70 տոկոսն է։

9. Քեշը արդյունքները և առանձին շուլերը concarrenci։

10. J: p95, scanned bytes, shuffle, spill, hit-rate։

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 Keyset-pagination

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-patterna

«III III» վաճառքում; projpruning բացակայությունը։

MSSET-ը միլիոնավոր տողերի վրա։

COUNT DISTINCT առանց ձողերի; համարեցին ամբողջական som։

NLJ մեծ հավաքածուներում։ JSON արտահայտություններով։

Փոքր կուսակցություններ և ցրված ֆայլեր (մետատվյալների փոթորիկ)։

UDF տողերը WHLS-ում 'կոլոնների նյութականացման փոխարեն։

Վիճակագրությունը/ANMS ZE-ը կույր օպտիմիզատոր է և fronscan։

Ռեգրեսիայի թեստերի և արձագանքի շեմերի բացակայությունը։

18) Իրականացման ճանապարհային քարտեզը

0-30 օր (MVP)

1. Zamer-N հարցումները և SLO/SLI տեղադրումը։

2. Կուսակցությունները + տեսակավորում/կլաստեր-քեյսներ; միացրեք wwww.skipping/bloom։

3. Մեկ MV-ը «տաք» զեկույցի վրա։ HLL/TDigest в BI.

4. Հարցումների փամփուշտների բաժանումը, որը տեղադրված է resortcache-ում։

30-90 օր

1. Ծանր պատուհանների ձայնագրությունը/JSON-ը կանխատեսում/սյունակներ։

2. Broadcast-join փոքր կղզիներ; SMJ մեծերի համար; NLJ։

3. Կոմպոզիցիան և գովազդումը ժամանակացույցով։ ավտոմեքենաների փոխադրողը։

4. Դեգրադացիայի, A/B պլանների, աուտո-ռեպատի դիտարկումը և ալերտները։

3-6 ամիս

1. Պրոյեկցիաների/MV-ի կատալոգը տարբերակման և SLA-ի հետ։

2. Approx-միջուկը distinct/percentile/top-k-ի համար բոլոր dashbords-ի համար։

3. Ռեֆլեքսային թեստերի միասնական ձևանմուշները և $/հարցումը։

4. JSON-ի և UDF-ի մշտական հիգիենան 'նյութականացում և ինդեքսներ։

19) RACI

SystePlatform (R) 'կուսակցություն/կլաստերիզացիա/կոմպակտացիա, MV/պրոյեկցիա, քեշներ, ռուսական։

Antrox/BI (R) 'SQL, approx ագրեգատներ, ռեգրեսիայի թեստեր։

Domain Owners (C) 'կտրվածքների և ճշգրտության պահանջներ։

System/DPO (A/R) 'մասնավորություն/PII, k-անանուն ագրեգատների։

MSE/Observability (C): SLO/alerting, concarency և capasity։

Finance (C) 'բյուջեներ դոլար/հարցում և տնտեսական ազդեցություն։

20) Կապված հատվածներ

Վերլուծական պահեստների ինդեքսավորումը, Տվյալների սխեմաները և դրանց էվոլյուցիան, Տվյալների Valivation, Intel Ops պրակտիկան, տվյալների կլաստերիզացիան, Չափման նվազումը, API վերլուծաբանները և մետրիկը, MLOps-ը 'մոդելների շահագործումը։

Արդյունքը

Հարցումների օպտիմիզացումը ոչ թե «կախարդական հինթ» է, այլ համակարգը 'տվյալների գրագետ գծանշում (կուսակցություն), նախածննդյան և approximate ալգորիթմներ, ճիշտ JOIN ռազմավարություն, քեշ/concarrency և մշտական p95 և scanned bytes։ IGaming-ի համար դա նշանակում է արագ և կայուն վճարումներ, խաղեր և կոմպլանսներ 'SLA-ի և բյուջեի շրջանակներում։

Contact

Կապ հաստատեք մեզ հետ

Կապ հաստատեք մեզ հետ ցանկացած հարցի կամ աջակցության համար։Մենք միշտ պատրաստ ենք օգնել։

Telegram
@Gamble_GC
Սկսել ինտեգրացիան

Email-ը՝ պարտադիր է։ Telegram կամ WhatsApp — ըստ ցանկության։

Ձեր անունը ըստ ցանկության
Email ըստ ցանկության
Թեմա ըստ ցանկության
Նամակի բովանդակություն ըստ ցանկության
Telegram ըստ ցանկության
@
Եթե նշեք Telegram — մենք կպատասխանենք նաև այնտեղ՝ Email-ի дополнение-ով։
WhatsApp ըստ ցանկության
Ձևաչափ՝ երկրի կոդ և համար (օրինակ՝ +374XXXXXXXXX)։

Սեղմելով կոճակը՝ դուք համաձայնում եք տվյալների մշակման հետ։