Ana içeriğe geç
Bulut & Altyapı

Postgres SELECT DISTINCT sorguları büyük veri setlerinde ölçeklenmiyor

Öne çıkanlar

  • Postgres, SELECT DISTINCT sorgularında benzersiz değer sayısı az olsa bile eşleşen tüm satırları tarıyor.
  • MySQL benzeri sistemlerde bulunan gevşek indeks taraması özelliği Postgres çekirdeğinde yer almıyor.
  • Özyinelemeli CTE yaklaşımı, 1 milyon satırlık veri setlerinde sorgu gecikmesini sabit tutmayı başardı.

DBOS mühendisleri, Postgres tabanlı kuyruk sistemlerinde SELECT DISTINCT ifadesinin büyük veri kümelerinde beklenmedik performans kayıplarına yol açtığını belirledi. Doğru indeksleme yapılmasına ve benzersiz değer sayısının çok az olmasına rağmen sorgunun, koşullarla eşleşen tüm satırları tek tek taradığı görüldü. Birkaç benzersiz bölüm anahtarını bulmak için 1 milyon satırın tamamını tarayan Postgres, milisaniyeler sürmesi beklenen işlemi saniyeler seviyesine çıkardı.

Söz konusu darboğazın temelinde Postgres sorgu planlayıcısının çalışma mantığı yatıyor. MySQL gibi ilişkisel veri tabanlarında benzersiz değerleri doğrudan atlayarak getiren gevşek indeks taraması (loose index scan) bulunurken, Postgres bu yapıyı yerel olarak barındırmıyor. Postgres 18 ile gelen atlama taraması optimizasyonu da tüm eşleşen satırları incelemeyi sürdürdüğü için bu soruna çözüm sunmuyor. Veri tabanı, uygun bir tarama operatörü bulunmadığından tam indeks taraması gerçekleştirmek zorunda kalıyor.

Mühendisler, performans sorununu aşmak için özyinelemeli ortak tablo ifadelerini (recursive CTE) kullanan alternatif bir sorgu kurguladı. Bu yöntem, her adımda sıralı indeksten yalnızca sıradaki en küçük benzersiz değeri arayarak gereksiz satır taramalarını bütünüyle engelledi. Yapılan testlerde, bölüm başına satır sayısı 1 binden 1 milyona çıksa bile özyinelemeli sorgunun gecikme süresinin sabit kaldığı ve sistemin kararlı çalıştığı kaydedildi.

Kaynak

Bu özet yapay zekâ ile hazırlanmıştır; ayrıntılar ve doğrulama için orijinal kaynağa başvurun.