• DİKKAT !

    Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak Dosya Yükleme tamamen ücretsizdir.

Çözüldü Power Query "Table.Buffer" Fonksiyonunun İç İçe Döngülerde (Nested Joins) Doğru Kullanımı ve Katlanma (Folding) Kaybı

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.
Durum
Konu Çözümlendiği İçin Kapatılmıştır.

avcibahar

Yeni Üye
Aktivite

0%

Katılım
31 Ağu 2026
Mesajlar
5
Aldığı beğeni
1
Konu Sahibi
Windows 10 Google Chrome 152
Selamlar,
Power Query kullanarak ham veri tablolarımı işlerken çok garip bir performans sorunu yaşıyorum. Birbirine bağlı 3 farklı sorguyu (Sorgu1, Sorgu2, Sorgu3) satır bazında satır satır eşleştirmek için Table.NestedJoin veya özel sütun ekleyerek satır içi filtreleme yapıyorum.İnternetteki yabancı kaynaklarda, alt sorguların sürekli yeniden hesaplanmasını önlemek ve veriyi RAM'e sabitlemek için Table.Buffer fonksiyonunun kullanılması gerektiği yazıyor. Ancak bu fonksiyonu sorgunun tam olarak hangi adımına yerleştirmeliyim? Bazı denemelerimde Table.Buffer ekledikten sonra sorgu katlanması (Query Folding) devre dışı kaldı ve veri tabanından veriyi çekme süresi daha da uzadı.Büyük veri dönüşümlerinde Table.Buffer kullanırken Query Folding mekanizmasını bozmadan hızı artırmanın formülü nedir? Adım bazında mantığı açıklayabilirseniz çok sevinirim.
 
Çözüm
Merhaba,
Çok hassas ve Power Query performans mimarisinin en kritik noktalarından birine değinmişsiniz. Table.Buffer fonksiyonu, veriyi RAM'e sabitleyerek alt sorguların (Nested Joins) satır bazında tekrar tekrar tetiklenmesini engeller. Ancak yanlış adımda kullanıldığında dediğiniz gibi Query Folding (Sorgu Katlanması) mekanizmasını tamamen kırar.
Bu mekanizmayı bozmadan hızı artırmak için şu altın kuralı uygulayabilirsiniz:
  1. Ana Sorguda Değil, Alt Sorguda Kullanın: Table.Buffer işlemini veriyi çektiğiniz ana büyük sorguya değil, birleştirmek (Join) istediğiniz küçük/yardımcı alt sorguların son adımına uygulamalısınız.
  2. Katlanmayı (Folding) Koruma Sıralaması: Alt sorgunuzda veri tabanından filtreleme, sütun seçme...
Windows 10 Google Chrome 152
Merhaba,
Çok hassas ve Power Query performans mimarisinin en kritik noktalarından birine değinmişsiniz. Table.Buffer fonksiyonu, veriyi RAM'e sabitleyerek alt sorguların (Nested Joins) satır bazında tekrar tekrar tetiklenmesini engeller. Ancak yanlış adımda kullanıldığında dediğiniz gibi Query Folding (Sorgu Katlanması) mekanizmasını tamamen kırar.
Bu mekanizmayı bozmadan hızı artırmak için şu altın kuralı uygulayabilirsiniz:
  1. Ana Sorguda Değil, Alt Sorguda Kullanın: Table.Buffer işlemini veriyi çektiğiniz ana büyük sorguya değil, birleştirmek (Join) istediğiniz küçük/yardımcı alt sorguların son adımına uygulamalısınız.
  2. Katlanmayı (Folding) Koruma Sıralaması: Alt sorgunuzda veri tabanından filtreleme, sütun seçme gibi tüm Folding destekleyen adımları tamamlayın. Bu adımların bittiği en son satıra gelip gelişmiş düzenleyicide (M Dili) şu şekilde buffer uygulayın:
    TamamlananAdim_Buffer = Table.Buffer(SonFiltreliAdim)
  3. Ana Sorguda Çağırma: Ana sorgunuzda Table.NestedJoin yaparken kaynak tablo olarak bu buffer'lanmış alt sorguyu gösterdiğinizde, veri tabanı katlanması ana sorguda devam ederken alt sorgu RAM'den beslenir ve performans tavan yapar.
Sizin ekli dosyada durum tam olarak nasıl kurgulandı? Gelişmiş düzenleyicideki M kodlarınızı paylaşırsanız, Table.Buffer satırını tam olarak hangi adıma koymanız gerektiğini netleştirebiliriz. Ustalarımızın da bu konuda farklı bir optimizasyon önerisi varsa öğrenmek isterim.

Galapagos hocamın alanı diye hatırlıyorum ama yanlışta hatırlıyor olabilirim.
 
Çözüm
Konu Sahibi
Windows 10 Google Chrome 152
Akuma hocam harika bir noktaya değinmişsiniz, ağzınıza sağlık.
Söylediğiniz gibi Table.Buffer adeta iki ucu keskin bir bıçak. Yanlış yerde kullanıldığında sql sunucusuna gidecek tüm yükü Excel'in üstüne yıkıp bilgisayarı kilitleyebiliyor, doğru yerde kullanıldığında ise saatler süren sorguları saniyelere indirebiliyor.
Ben de denemelerim ve yabancı kaynaklardaki optimizasyon makaleleri ışığında bu sorunu tamamen çözdüm. Table.Buffer kullanırken Query Folding'i bozmadan performansı uçurmanın altın standart kurgusunu adım adım paylaşıyorum. İleride bu konuyu inceleyecek dostlara da rehber olsun

Table.Buffer fonksiyonunun mantığı, veriyi o adımdan itibaren dondurmak ve veri tabanıyla olan bağını koparmaktır. Bu yüzden ana kuralımız şudur: Veri tabanından ne kadar yük atabiliyorsan at, SQL işini bitirdiği an veriyi RAM'e al.

Gelişmiş Düzenleyici (M Dili) İçin Doğru Şablon Kurgu:
Eğer Sorgu1 ana tablomuz, Sorgu2 ise iç içe döngüye (Nested Join) sokacağımız yardımcı tablaysa, kurgu tam olarak şöyle olmalıdır:
1. Adım: Alt Sorguyu Hazırlama (Sorgu2)
Alt sorgumuzda veri tabanının gücünü sonuna kadar kullanıyoruz (Filtreleme, sütun kaldırma vb. hepsi Folding destekler). SQL'in işi bittiği en son adımda Table.Buffer uyguluyoruz:,

HTML:
JavaScript:
İçeriği görebilmek için Giriş yap ya da Üye ol.

2. Adım: Ana Sorguda Birleştirme (Sorgu1)
Ana sorgumuz veri tabanına doğrudan bağlı kalmaya ve Query Folding yapmaya devam eder. Birleştirme adımında doğrudan yukarıda buffer'ladığımız Sorgu2'yi çağırırız

HTML:
JavaScript:
İçeriği görebilmek için Giriş yap ya da Üye ol.

  • Ana sorguda asla Table.Buffer kullanmadık. Böylece ana sorgunun SQL sunucusuyla olan Query Folding bağı kopmadı, sunucu veriyi katlamaya devam etti.
  • Alt sorgunun sadece en son adımını buffer'ladık. Böylece alt sorgu çekilirken de sunucu gücünden faydalandık, ancak bir kere RAM'e yerleştiği için Table.NestedJoin her satırı tararken SQL sunucusuna milyonlarca kez gereksiz sorgu (Sorgu Şişmesi / Query Inflation) atmamış oldu.
Bu mantıkla kurguladığımda modelimdeki kilitlenme ve donma sorunları tamamen ortadan kalktı, performans tavan yaptı. Konuyu çözüldü olarak işaretliyorum.
Akuma hocama tekrar çok teşekkürler.
 
Durum
Konu Çözümlendiği İçin Kapatılmıştır.
Geri
Üst