Tablo Bölümleme — Eski Yılı Silmek Neden Bütün Geceyi Aldı?
Önce şunu oku: MVCC ve Kilitler — Eski Satır Sürümleri Nerede Yaşar?
30 saniyede özet
Hareket tablosu büyüdükçe hem aylık raporlar hem de eski veriyi silmek ağırlaşır. Tabloyu aylara bölmek, tarihe göre süzen sorguların gereksiz ayları hiç okumamasını ve eski ayların satır satır silinmek yerine bir anda atılmasını sağlar.
Bir ofis iki yılın fişlerini tek bir koliye atıyor. Ekim’in fişlerini bulmak için bütün koliyi karıştırmak gerekiyor. Eski yılı atmak içinse fişleri tek tek ayıklamak.
-
Bayt: Hareket tablosunda iki yıllık veri var. Ekim raporu her ay biraz daha yavaş.
-
Sen: Saklama süresi dolan geçen yılı silmek için gece bir DELETE başlattım. Sabah hâlâ çalışıyordu.
-
Bayt: Üstelik tablo küçülmedi bile! Silinen satırlar yer kaplamaya devam ediyor.
-
Bayt: Fişleri aylık klasörlere ayırsaydık, eski yıl tek bir raf olurdu.
Tek tablo, birçok parça
tablo bölümlemeTek bir mantıksal tabloyu, örneğin aylara göre, aynı veritabanında ayrı parçalarda saklamak. Sorgular yine tek tabloya yazılır.Sözlükte gör →, tek bir mantıksal tabloyu aynı veritabanında ayrı parçalarda saklar. Hareketler için en doğal anahtar tarihtir: her ay bir parça.
Uygulama hâlâ transactions tablosuna yazar. Veritabanı her satırı, tarihine bakarak doğru aya koyar.
Kafam karıştı, daha basit anlat
Tablo tek görünür, ama içi aylara bölünmüştür.
Tablo bölümleme nedir?
Bölümleme ile sharding arasındaki fark nedir?
Okumadığın ay, attığın ay
Tablo aylara bölündü. Bir müşterinin bütün hareketlerini müşteri numarasıyla arayan, tarih içermeyen bir sorgu kaç aya bakar? Cevabı göster
Hepsine. Sorguda tarih yok; veritabanı müşterinin hangi aylarda hareketi olduğunu bilemez ve her parçaya bakar. Bölümleme yalnızca sorgu bölümleme anahtarını kullanıyorsa parça atlar.
Adım adım oku
- İki yılın fişleri tek bir kolide.
- Ekim'i bulmak için hepsini karıştır.
- Her ay ayrı klasör, sırtında adı.
- Ekim tek klasör; eski yıl tek raf.
Sorgu tarihe göre süzüyorsa, veritabanı diğer ayların parçalarını hiç okumaz. Buna bölüm budamaSorgudaki koşula bakarak işe yaramayacak parçaların hiç okunmaması. Sorgu bölümleme anahtarını kullanmıyorsa olmaz.Sözlükte gör → denir.
En büyük kazanç ise çoğu zaman silmede görülür. DELETE her satırı tek tek işaretler ve geride MVCCMulti-version concurrency control: yazma yeni bir satır sürümü üretir, okuyan commit edilmiş eski sürümü görür. Okuyan ile yazan birbirini beklemez.Sözlükte gör →’nin temizlemesi gereken ölü satırlar bırakır. Bölünmüş tabloda eski ayın parçası bir anda atılır.
Kafam karıştı, daha basit anlat
Tarihle süzen sorgu yalnızca gereken ayı okur. Eski ay satır satır silinmez, bir anda atılır.
Ayrı ayrı aylara bölünmüş bir tabloda Ekim raporu neden daha az veri okur?
Bölümlenmiş bir tabloda müşteri numarasıyla, tarihsiz bir sorgu ne yapar?
Kendin gör
İki yıllık hareket tablosu
Tohum 524492- Oca·
- Şub·
- Mar·
- Nis·
- May·
- Haz·
- Tem·
- Ağu·
- Eyl·
- Eki·
- Kas·
- Ara·
- Oca·
- Şub·
- Mar·
- Nis·
- May·
- Haz·
- Tem·
- Ağu·
- Eyl·
- Eki·
- Kas·
- Ara·
▤ okundu · ✕ satır satır silindi · ✓ parça atıldı · – atlandı
Satırlarına dokunulan ay: 0/24
Şu an ne oldu?
Tek büyük tablo · Ekim ayının toplam raporu
Her kare bir aylık hareket.
Görevler0/3
Tek ayın raporu için iki yılın hepsine bakılsınaçık
İpucu
Tek büyük tablo.
Bölünmüş tabloda bile her parçaya bakılsınaçık
İpucu
Sorguda tarih olmasın.
Eski yılı tek bir satıra dokunmadan silaçık
İpucu
Aylara böl, sonra sil.
Olay günlüğü (0)
Henüz olay yok. Oynat veya adımla.
- Varsayılanla oynat. Tek büyük tablo, Ekim raporu: yirmi dört ayın hepsine bakıldı.
- “Aylara bölünmüş tablo” seç. Yalnızca Ekim okundu.
- “Bir müşterinin bütün hareketleri” seç. Bölünmüş tabloda bile her aya bakıldı.
- “En eski 12 ayı sil” seç, iki düzeni de dene. Tek tabloda on iki ay satır satır silindi; bölünmüş tabloda on iki parça bir anda atıldı.
Eski bir yılın hareketlerini silmenin bölümlenmiş tablodaki en ucuz yolu nedir?
Tek büyük tablodan bir yıllık veriyi DELETE ile silmenin yan etkisi nedir?
Tuzaklar
Gelecek ayın parçasını unutmak. PostgreSQL yeni ayın parçasını kendiliğinden açmaz; parça yoksa o ayın hareketleri eklenemez. Gelecek birkaç ayın parçalarını önceden oluşturan bir iş kur.
Birincil anahtarı eski hâliyle bırakmak. Benzersizlik her parçada ayrı kontrol edildiği için birincil anahtar bölümleme sütununu da içermelidir: (id, booked_at).
Çok küçük parçalar. Günlük parçalar, planlayıcının her sorguda düşündüğü parça sayısını büyütür. Parça boyunu sorgulara ve saklama kuralına göre seç.
Kafam karıştı, daha basit anlat
Parçaları önceden aç, anahtara tarihi ekle, parçaları gereğinden küçük yapma.
Bölümleme anahtarı nasıl seçilmelidir?
Derinleş · Hesap hareketleri: aylık parçalar ve saklama işi 4 dosya · ~55 satır · ilk okumada atlayabilirsin
Kendini sına
Tablo bölümleme veriyi farklı sunuculara dağıtır.
Yeni ay başladı ama o ayın parçası oluşturulmamış. Ne olur?
Aklında kalacak üç şey
- 1 Tablo bölümleme, tek bir mantıksal tabloyu aynı veritabanında, örneğin aylara göre, ayrı parçalarda saklar.
- 2 Sorgu bölümleme anahtarıyla süzüyorsa gereksiz parçalar hiç okunmaz. Tarihsiz bir sorgu ise yine bütün parçalara bakar.
- 3 Eski veriyi DELETE ile satır satır silmek yerine, o ayın parçası bir anda atılır.
4 kart sonraki derste seni bekliyor