GH GambleHub

Analitik sorguların optimizasyonu

1) Neden optimize edilir (iGaming bağlamı)

İş hızı: GGR/NET raporları, sağlayıcılar/oyunlar, RG/AML ve p95 SLA'da pazarlama.
Maliyet: Daha az taranmış bayt ve shafl - $/request'in altında.
Güvenilirlik: kararlı pik saatler, BI donma yok.
Ölçek: Düzinelerce marka/pazar, milyarlarca satır, tazelik dakikaları.

2) Yük profili ve SLO

İsteklerin'ilk %90'ını açıklayın: pencereler (7/28/90d), filtreler ('marka, ülke, sağlayıcı, psp, durum'), join'ler, JSON nitelikleri, üst K ve yüzdelikler.
SLO örnekleri: p95 ≤ 1. Pano için 2 s, taranmış bayt ≤ 256 MB/istek, tazelik ≤ 5 dk.

3) Planların anatomisi: ne aramalı

Tahmin/Projeksiyon aşağı itme - Filtreler ve sütun listesi kaynağa atlanır.
Bölüm budama ve veri atlama (min-max/bloom/manifest).
Vektörize tarama/geç materyalizasyon: JOIN/PROJECT tarafından ertelenen sütun okumaları.
Stratejiye katılın: Yayın Hash (BHJ), Sıralama Birleştirme (SMJ), İç İçe Döngü (NLJ - избегать).
Spill & shuffle: Diske karıştırma ve dökülme hacmi SLA'nın ana düşmanıdır.
Uyarlanabilir sorgu yürütme: çalışma zamanında strateji değişikliği (BHJ↔SMJ anahtarlama, dinamik coales).

Plan şunları göstermelidir: kaç bayt okuduğumuzu, şaflim nerede, neyi önbelleğe aldığımızı.

4) Taraflar, sıralama, küme durumları

Taraflar: 'tarih' + 1-2 erişim boyutlarına göre (örneğin, 'marka, ülke').
Sıralama/kümeleme: 'ORDER BY/CLUSTER BY/Z-order' by frequent filters/joins ('sağlayıcı, game_id, occurred_at').
Yeniden sınıflandırma ve sıkıştırma: veri atlama için düzenli aktarım; Hedef dosya boyutu 128-1024 MB'dir.

5) JOIN desenleri

Yayın Hash Join (BHJ): küçük boyut (≤ yüzlerce MB) - gerçek yayın.

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

Sort-Merge Join (SMJ): büyük kümeler, uyumlu anahtar sıralama/küme örnekleri - minimum şaft.
Ön birleştirme/denormalizasyon: kararlı nitelikleri 'loş'tan gerçek anlık görüntüye _' (projeksiyon/materyalize görünüm) taşıyın - eksi kritik yolda JOIN.
Anti/semijoins: 'NOT IN/EXISTS'i açık yarı/anti-join planlarına yeniden yazın.
Bir kardinal patlamanın ortadan kaldırılması: boyutlardaki yinelenen anahtarları kontrol edin, vekil anahtarları kullanın.

6) GRUP BY, toplamalar ve ön toplamalar

Toplama/Küp/Gruplama Kümeleri: Birden çok toplama yerine bir faz.

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));

Materyalize görünümler (MV )/projeksiyonlar: 'payments _ 7d _ by _ brand _ psp', 'rounds _ 1d _ by _ provider _ game'.
Kısmi - Nihai toplama: motorun kısmen işçiler (yerel) ve son olarak koordinatör üzerinde toplanmasına izin verin.
Yaklaşık: 'COUNT (DISTINCT user)' için HLL, yüzdeler için TDigest - BI için çok daha ucuz ve yeterli.

7) Pencere fonksiyonları (düzgün)

Tam olarak yüksek seçiciliğe sahip anahtarlarda PARTITION BY; SIPARIŞ BY - sütun sıralamasına göre.
Ağır pencereleri mümkünse ön agrega ve yarı birleştiricilerle değiştirin.

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) Filtreler, sayfalama ve TOP-K

Filtre sırası CBO için önemli değildir, ancak seçicilik ve indeksler/sıralama önemlidir.
LIMIT... TIES/APPROACH TOP-K ile - taramayı kısaltın.
Pagination: Büyük tablolar için 'OFFSET/LIMIT' yerine 'keyset pagination'.

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

9) JSON/Yarı Yapılandırılmış

Sıcak yolları sütunlara ('aygıtı. os ',' psp. Yöntem ').
Motor destekliyorsa, JSON yollarında ters/GIN indekslerini kullanın.
UDF'den satır satır kaçının: vurgulanan niteliklerle daha iyi projeksiyon.

10) Yaklaşık ve Örnekleme

HLL/Theta Sketch: Ucuz 'COUNT DISTINCT'.
TDiggest/KLL: tam sıralama olmadan persentiller p95/p99.
Rezervuar/tabakalı örnekleme: etkileşimli araştırma ve önizleme.

11) Hafıza, Boğaz ve Concarrency

Spill-guard: join/agg üzerindeki bellek sınırları; Dökülürken - toplu/paralelliği azaltın, anahtara göre sıralamayı artırın.
Eşzamanlılık ve QoS: "sıcak" panolar ve ağır hell-hoc için havuzlar; tarama/zaman sınırları; "unutulmuş" isteklere kill-switch.
Sonuç önbelleği/sorgu önbelleği: tekrarlanabilir BI şablonlarını etkinleştirin, tazelik belirteci ile devre dışı bırakın.

12) Regresyon testleri ve "çift çalışma"

Üst N sorguları için referans profillerini (plan/tarama baytları/zamanı) depolayın.
Dizinleri/kümeleri yayınlamadan önce - A/B çalıştırması: p95'i, taranmış baytları, atlanan paylaşımı, karıştırmayı karşılaştırın.
"Hızlı başarısız" eşikleri oluşturun: p95 yükseldiyse> X % - geri alma.

13) Gözlemlenebilirlik ve SLO

SLI:
  • P50/p95/p99 gecikme, taranmış bayt/sorgu, atlanmış bayt %, dokunulan dosyalar;
  • shuffle baytlar, dökülen baytlar, pik bellek;
  • önbellek isabet oranı; Doğruluk yaklaşım kümeleri.

Uyarılar: taranan baytlarda artış, atlanan paylarda düşüş, sık NLJ'ler, dökülme> eşikler.

14) iGaming kılıfları (tarifler)

14. 1 Ödemeler/PSP'ler: "feragat zirveleri"

WHERE: 'ts BETWEEN NOW () -7d AND NOW ()', 'brand, country, psp, status'.
Parti: gün; ORDER/Z-order: '(marka, ülke, ts)'; bitmap: 'psp, durum'; bloom: 'transaction _ id'.
MV: 'payments _ 7d _ by _ brand _ psp (status)'.
Sonuç: P95 - ~ 1s, taranmış baytlar ↓ 5-10 ×, sıfır boğaz.

14. 2 Oyun Turları: En İyi K Oyunları/Saat

ORDER BY/cluster по '(sağlayıcı, game_id, occurred_at)'; Ön agregalar için projeksiyon.
P95 yuvarlak süresi için yaklaşık Top-K + TDiggest.
Alt satır: sıcak önbellekteki ikinci altı grafikler.

14. 3 RG/AML Aktif Limitleri

JSON 'reason' - sütun; Bitmap'rg _ state ',' kyc _ level '; Son devletle yarı birleşme.
Sonuç: "30 gün boyunca" rapor edin - saniye, tam tarama olmadan.

15) Optimizasyon kontrol listesi (günlük)

1. Üst N isteklerinin ve profillerinin toplanması (plan/bayt/shafl).
2. Tarihe göre gruplar + kararlaştırılmış sıralama/küme durumları.
3. Aşağı itme ve projeksiyon budama kontrolü (sadece gerekli sütunlar).
4. JOIN stratejisi: küçük yayın, SMJ için sıralama, NLJ yok.
5. Sıcak panolar için ön toplama/MV.
6. Yaklaşık nerede geçerli (farklı/yüzdelik/üst-k).
7. JSON - sütunlar ve/veya ters endeksler.
8. Sıkıştırma/yeniden sınıflandırma; bayt hedefi %70 ≥ atlandı.
9. Sonuç önbelleği ve ayrı concarrency havuzları.
10. İzleme: p95, taranmış bayt, karıştırma, dökülme, isabet oranı.

16) Şablonlar (kullanıma hazır)

16. 1 Optimizasyon Politikası (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 Sorgu regresyon testi (pseudo-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 AYRI yeniden yazma

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 sayfalama

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

'SELECT' içinde prod; projeksiyon budama eksikliği.
OFSET sayfalama milyonlarca satırda.
Taslaklar olmadan COUNT DISTINCT; Tam sıralama yoluyla yüzdelik dilimler.
Büyük setlerde NLJ; JSON ifadeleri ile katılın.
Küçük gruplar ve dağınık dosyalar (meta veri fırtınası).
Sütunları somutlaştırmak yerine WHERE içindeki UDF dizeleri.
İstatistikleri görmezden gelin/ANALYZE - kör iyileştirici ve tam tarama.
Regresyon testi ve geri dönüş eşiği yok.

18) Uygulama Yol Haritası

0-30 gün (MVP)

1. Üst N isteklerinin ölçümü ve SLO/SLI kurulumu.
2. Tarihe göre gruplar + sıralama/küme durumları; veri atlamasını/açmasını etkinleştirin.
3. Sıcak ödeme raporu başına bir MV; HLL/TDiggest в BI.
4. Sorgu havuzlarını bölün, sonuç önbelleğini etkinleştirin.

30-90 gün

1. Ağır pencereler sayım/JSON - ön toplama/sütunlar.
2. Broadcast-join küçük boyutlar; Büyük için SMJ; NLJ'nin ortadan kaldırılması.
3. Zamanlama sıkıştırma ve yeniden sınıflandırma; Anahtar danışman.
4. Gözlenebilirlik ve bozulma uyarıları, A/B planları, otomatik geri alma.

3-6 ay

1. Sürüm oluşturma ve SLA ile projeksiyon/MV kataloğu.
2. Tüm panolarda farklı/persentil/top-k için yaklaşık çekirdek.
3. Regresyon testleri ve $/request bütçeleri için tek tip şablonlar.
4. JSON ve UDF kalıcı hijyen: materyalizasyon ve indeksler.

19) RACI

Veri Platformu (R): bölümler/kümeleme/sıkıştırma, MV/projeksiyonlar, önbellekler, izleme.
Analytics/BI (R): SQL yeniden yazma, yaklaşık kümeler, regresyon testleri.
Alan Sahipleri (C): bölümler ve doğruluk için gereksinimler.
Güvenlik/DPO (A/R): Gizlilik/PII, kümelerin k-anonimliği.
SRE/Gözlenebilirlik (C): SLO/uyarı, concarrency ve kapasite.
Finans (C): $/talep ve ekonomik etki için bütçeler.

20) İlgili bölümler

Analitik Depolama İndeksleme, Veri Şemaları ve Evrimi, Veri Doğrulama, DataOps Uygulamaları, Veri Kümeleme, Boyut Azaltma, Analitik ve Metrikler API, MLOps: Model Sömürü.

Toplam

Sorgu optimizasyonu bir "sihirli ipucu'değil, bir sistemdir: yetkin veri işaretlemesi (bölümler/kümeler), ön toplama ve yaklaşık algoritmalar, doğru JOIN stratejileri, önbellek/concarrency ve p95 ve taranmış baytların sürekli izlenmesi. IGaming için bu, SLA ve bütçe dahilinde ödemeler, oyunlar ve uyumluluk için hızlı ve istikrarlı metrikler anlamına gelir.

Contact

Bizimle iletişime geçin

Her türlü soru veya destek için bize ulaşın.Size yardımcı olmaya her zaman hazırız!

Telegram
@Gamble_GC
Entegrasyona başla

Email — zorunlu. Telegram veya WhatsApp — isteğe bağlı.

Adınız zorunlu değil
Email zorunlu değil
Konu zorunlu değil
Mesaj zorunlu değil
Telegram zorunlu değil
@
Telegram belirtirseniz, Email’e ek olarak oradan da yanıt veririz.
WhatsApp zorunlu değil
Format: +ülke kodu ve numara (örneğin, +90XXXXXXXXX).

Butona tıklayarak veri işlemenize onay vermiş olursunuz.