Pencere Fonksiyonları — Ekstrede Yürüyen Bakiye Nasıl Hesaplanır?
Önce şunu oku: SQL İndeksleme ve EXPLAIN
30 saniyede özet
Ekstrede her hareketin yanına o ana kadarki bakiye yazılır. Her satırda öncekileri yeniden toplamak karesel büyür; hepsini çekip Java'da toplamak da son sayfa için bütün geçmişi taşır. SUM() OVER tek geçişte, veritabanında hesaplar.
Eski banka cüzdanlarında her satırın yanında bakiye yazardı. Bir memur her yeni satırda sayfanın başından itibaren yeniden toplar. Öbürü bir cetveli aşağı kaydırır ve toplamı satırdan satıra taşır.
-
Bayt: Ekstre ekranında her hareketin yanına bakiye yazmamız gerekiyor.
-
Sen: Her satır için öncekileri toplayan bir alt sorgu yazdım. Çalışıyor!
-
Bayt: Ama on yıllık bir hesapta ekran dakikalarca bekliyor. Her satır bütün geçmişi yeniden okuyor.
-
Bayt: Cetveli aşağı kaydıran memur gibi tek geçişte toplamamız gerekiyor.
Gruplamadan hesaplamak
GROUP BY bir hesabın bütün hareketlerini tek bir toplama indirir. Ekstrede ise her hareket yerinde kalmalı, yanına o ana kadarki bakiye yazılmalıdır.
Bir pencere fonksiyonuSatırları gruplamadan, her satırın yanına bir pencere üzerinden hesap ekleyen SQL fonksiyonu: SUM() OVER, ROW_NUMBER() OVER gibi.Sözlükte gör → tam olarak bunu yapar: satırları gruplamadan, her satırın yanına bir pencere üzerinden hesap ekler. SUM(amount) OVER (ORDER BY booked_at) yürüyen toplamı verir.
Kafam karıştı, daha basit anlat
Pencere fonksiyonu satırları korur ve her birinin yanına bir toplam ekler.
Pencere fonksiyonu ile GROUP BY arasındaki temel fark nedir?
Ekstrede her satırın yanına o ana kadarki bakiyeyi yazan ifade hangisi?
Üç yol, aynı bakiye
Ekstrede sekiz hareket var. Her satır için kendisinden önceki bütün satırları toplayan bir alt sorgu yazdık. Toplam kaç satır okunur? Cevabı göster
36 satır. Birinci satır 1, ikinci 2, sekizinci 8 satır okur: 1’den 8’e kadar toplam 36. Bin hareketlik bir hesapta bu sayı yarım milyonu geçer.
Adım adım oku
- Cüzdan defteri: her satırın yanına bakiye.
- Bir memur her satırda baştan topluyor.
- Öbürü cetveli aşağı kaydırıyor.
- Tek geçiş, her satıra yürüyen toplam.
Satır başına çalışan doğru sonucu verir ama karesel büyür. Bütün satırları çekip Java’da toplamak tek geçiştir; ama son sayfayı göstermek için bile bütün geçmiş uygulamaya taşınır.
Pencere fonksiyonu satırları bir kez dolaşır ve süzmeyi veritabanında bırakır. Ekrana yalnızca gösterilecek satırlar gider.
Kafam karıştı, daha basit anlat
Alt sorgu tekrar tekrar okur. Java bütün satırları taşır. Pencere fonksiyonu bir kez okur, gerekeni gönderir.
Her satır için öncekilerin toplamını alt sorguyla almak neden pahalanır?
Ekranda yalnızca son 3 hareket var. Bakiyeyi Java'da hesaplamak için kaç satır çekmek gerekir?
Kendin gör
Ekstrede yürüyen bakiye
Tohum 413208| Tarih | Açıklama | Tutar | Bakiye |
|---|---|---|---|
| 01.10 | Maaş | 42.000 TL | … |
| 02.10 | Kira | -15.000 TL | … |
| 03.10 | Market | -1.850 TL | … |
| 05.10 | Elektrik | -920 TL | … |
| 08.10 | Arkadaştan havale | 600 TL | … |
| 12.10 | Kart ödemesi | -7.400 TL | … |
| 15.10 | Eczane | -310 TL | … |
| 20.10 | Kira iadesi | 1.500 TL | … |
Okunan satır: 36 · uygulamaya gönderilen: 8 · ekranda: 8
Şu an ne oldu?
Her satır için öncekileri yeniden topla (alt sorgu)
Her hareketin yanına o ana kadarki bakiye yazılıyor.
Görevler0/3
Aynı bakiye için 36 satır okunsunaçık
İpucu
Alt sorgu, bütün sayfa.
Üç satır göstermek için sekiz satır taşınsınaçık
İpucu
Java’da topla, son sayfa.
Son sayfa: sekiz satır oku, yalnızca üçünü gönderaçık
İpucu
Pencere fonksiyonu.
Olay günlüğü (0)
Henüz olay yok. Oynat veya adımla.
- Varsayılanla oynat. Alt sorgu: sekiz satırlık bakiye için 36 satır okundu.
- “Java’da topla” ve “son sayfa” seç. Ekranda üç satır var; uygulamaya sekiz satır taşındı.
- “Pencere fonksiyonu” seç. Sekiz satır okundu, yalnızca üçü gönderildi; bakiyeler aynı.
PARTITION BY account_id ne yapar?
Her hesabın en son hareketini bulmak için hangisi kullanılır?
Tuzaklar
Belirsiz sıralama. Aynı tarihli iki hareketin sırası garanti değildir; ara bakiyeler çalıştırmadan çalıştırmaya değişebilir. Sıralamaya id gibi benzersiz bir alan ekle.
Varsayılan çerçeve. ORDER BY içeren bir pencerede varsayılan çerçeve aynı değere sahip satırları birlikte toplar. Satır satır yürümek için ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW yaz.
WHERE içinde kullanmak. Pencere fonksiyonu WHERE’den sonra hesaplanır. Önce bir CTE içinde hesapla, sonra dışarıda süz.
Kafam karıştı, daha basit anlat
Sırayı benzersiz yap, çerçeveyi açıkça yaz, süzmeyi dışarıda yap.
Aynı tarihte iki hareket varsa ORDER BY booked_at ile yürüyen toplam neden belirsiz olabilir?
Derinleş · Hesap ekstresi: yürüyen bakiye veritabanında 4 dosya · ~52 satır · ilk okumada atlayabilirsin
Kendini sına
Pencere fonksiyonu satırları tek satıra indirir.
SUM() OVER (ORDER BY x) varsayılan çerçevesi eşit x değerlerinde ne yapar?
Aklında kalacak üç şey
- 1 Pencere fonksiyonu satırları gruplamaz; her satırı yerinde bırakır ve yanına bir hesap ekler.
- 2 Her satır için öncekileri yeniden toplayan alt sorgu, satır sayısı arttıkça karesiyle pahalanır.
- 3 SUM(amount) OVER (PARTITION BY hesap ORDER BY tarih, id) yürüyen bakiyeyi tek geçişte hesaplar; yalnızca gösterilecek satırlar gönderilir.
4 kart sonraki derste seni bekliyor
Bu dersin üstüne kurulanlar
Bunlar bu dersi temel alıyor; hazır olduğunda devam edebilirsin.