PostgreSQL TABLESAMPLE özelliğinin satır değil adres seçtiği ortaya kondu
Öne çıkanlar
- SYSTEM yöntemi sayfa numarasını, BERNOULLI ise satır işaretçisi adresini karma işlemine alarak seçim yapıyor.
- Sıralı eklenen sütunlarda SYSTEM yöntemiyle yapılan hesaplamalar blok kümelenmesi sebebiyle sapma gösteriyor.
- Tablo birleştirmelerinde TABLESAMPLE kullanımı sorgu paralelliğini devre dışı bırakıyor ve diğer tabloyu küçültmüyor.
PostgreSQL veri tabanında büyük tablolardan hızlı yaklaşık sonuçlar almak için kullanılan TABLESAMPLE komutunun çalışma mantığı teknik testlerle incelendi. İnceleme, SQL standardının parçası olan yöntemin sanılanın aksine doğrudan satırları değil, disk sayfalarını ve satır adreslerini (ctid) temel aldığını gösterdi. İki milyon satırlık sipariş tablosunda yapılan denemelerde, SYSTEM yönteminin rastgele satırlar yerine doğrudan 8 kB boyutundaki blokları seçtiği tespit edildi.
Fiziksel depolama mantığı nedeniyle veriler diske eklenme sırasına göre paketler halinde yerleşiyor. Bu durum, tarih gibi sıralı eklenen sütunlarda SYSTEM yöntemiyle yapılan minimum veya ortalama hesaplamalarında büyük sapmalara yol açtı. BERNOULLI yöntemi her satır işaretçisi için ayrı işlem yaptığından bu sapmayı engellese de her sayfayı okumak zorunda kaldığı için işlem süresini uzattı. Ayrıca satır güncellemeleri (UPDATE) sonrasında satır işaretçilerinin değişmesi, sabit tohum (REPEATABLE) kullanılsa bile BERNOULLI örnekleminde verilerin kaybolmasına neden oldu.
İlişkisel sorgularda da TABLESAMPLE kısıtlamalar barındırıyor. Yöntem yalnızca tanımlandığı tabloyu küçülttüğü için birleştirilen diğer tablolar tam taramaya maruz kalıyor ve sorgu paralelliği devre dışı kalıyor. İki tabloya birden uygulandığında ise eşleşen kayıt sayısı neredeyse sıfıra iniyor. Tutarlı ve yabancı anahtar ilişkilerini koruyan alt kümeler oluşturmak için birincil anahtarların hashint8extended gibi fonksiyonlarla karma değerine bakılması önerildi.
Bu özet yapay zekâ ile hazırlanmıştır; ayrıntılar ve doğrulama için orijinal kaynağa başvurun.