Sorgu katlama
Learn: Sorgu katlama, Power Query’nin dönüşümleri tek bir kaynak sorgusuna (örneğin tek bir SELECT) çevirmesidir. DirectQuery ve Dual tablolarda zorunludur. Import’ta en iyi yenileme performansını verir. Üç sonuç vardır: tam katlama, kısmi katlama (bir noktaya kadar kaynak, sonrası motor), katlama yok.
let
Kaynak = Sql.Database("srv", "AnadoluMarket"),
Satis = Kaynak{[Schema = "dbo", Item = "Satislar"]}[Data],
Filtre = Table.SelectRows(Satis, each [Tarih] >= #date(2024, 1, 1)), // katlanır
Sutun = Table.SelectColumns(Filtre, {"Tarih", "Tutar"}), // katlanır
Grup = Table.Group(Sutun, {"Tarih"}, {{"T", each List.Sum([Tutar])}}), // katlanır
Dizin = Table.AddIndexColumn(Grup, "Sıra", 1, 1) // çoğu kaynakta katlanmaz
in
Dizin
Nasıl anlarsın?
- Adıma sağ tık, View Native Query. Soluk ise o adım büyük olasılıkla katlanmıyordur; ama kesin kanıt değildir.
- Power Query Online’da katlama göstergeleri adım yanında durum gösterir.
- Araçlar → Diagnose Step kaynağa gönderilen sorguyu
Data Source Querysütununda gösterir (bağlayıcıya bağlıdır). - Kaynak tarafında SQL Profiler ya da benzeri izleme kesin sonuç verir.
Katlamayı koruyan düzen
- Filtre ve sütun seçimini en başa al. Learn: akış işlemleri önce, pahalı işlemler sona.
- Katlanmayan adımı bul, sonrasındaki adımları önüne alabiliyorsan al.
- Özel M fonksiyonu, Text.Proper gibi kaynakta karşılığı olmayan işlevler, farklı kaynakları birleştirmek, Dizin ve Table.Buffer katlamayı genellikle bozar.
- Bir SELECT ile yapılabilecek işi görünüm olarak veri tabanına taşı.
- Artımlı yenileme filtre katlanmazsa anlamını yitirir; önce katlamayı doğrula.
Table.Buffer ve List.Buffer
Table.Buffer tabloyu belleğe alır, değerlendirme sırasında dış değişikliklerden yalıtır. Learn’ün uyarısı açık: hızlandırmayabilir; hepsini okuyup bellekte tutmak yavaşlatabilir ve sonraki adımların katlanmasını engeller. Yalnız katlamayı durdurmak istiyorsan Table.StopFolding var. Buffer sığdır: hücredeki kayıt, liste ve tablo içeriklerini zorlamaz.
| Durum | Buffer? |
|---|---|
| Sıralı sonucu sabitleyip sonra Distinct ya da gruplama | Evet, sonuç sırası kritikse |
| Bir sorguyu satır fonksiyonunda defalarca okuyorsun | Evet: List.Buffer ya da Table.Buffer ile tek okuma |
| “Yavaş” diye rastgele her adıma | Hayır: bellek artar, katlama bozulur |
| Veri kaynağı katlıyor, filtre sonra gelecek | Hayır: tüm satırları çeker |
Sorgu tanılaması
Araçlar → Start Diagnostics, yenile, Stop Diagnostics. İki sorgu gelir: özet ve ayrıntılı. Exclusive duration (%) nerede vakit geçtiğini gösterir; yalnız aynı Id içinde toplanır. Power Query filtre listeleri ve üst veri için de sorgu çalıştırdığından tekrarlar görürsün.
Value.NativeQuery
Elle SQL gerektiğinde Learn’ün önerdiği yol budur: değerleri metne eklemek yerine parametre olarak geçirir.
let
Source = Sql.Database("server", "database"),
Result = Value.NativeQuery(
Source,
"SELECT * FROM Sales WHERE SalesYear = @year",
[year = 2024]
)
in
Result
- Sonraki adımlar katlanmaz; mümkün olan her işi sorgunun içine koy.
- Learn’e göre DirectQuery modeli düz
SELECTister: CTE ve saklı yordam olmaz. - Artımlı yenileme yerel SQL ile çalışmaz: Power Query tüm satırları çekip kendisi süzer.
- Geçerli her ifade çalışır, veri değiştiren ifade dahil. En az yetkili, salt okunur hesap kullan.
- Seçenek kaydı kaynağa özgüdür. SQL için kullanılan
[EnableFolding = true]üzerine sonraki adımların katlanması denenir, ama her kaynakta desteklenmez; sayfa bunu kaynağa bırakır. - Metin birleştirerek SQL kurma:
"... WHERE Yil = " & Text.From(x)hem yönetilmesi zordur hem de enjeksiyona açıktır.
Value.NativeQuery burada “bu alt kümede çalışmaz” der. Bunu M editöründe görebilirsin.Kısa performans listesi
- Gereksiz sütunu baştan at: en ucuz iyileştirme budur.
- Filtreyi erken uygula, sıralamayı en sona bırak.
- Başvuru zincirini anla: Learn’e göre başvuru, kaynağı iki kez sorgulatabilir.
- Birleştirmede küçük tarafı tampon yap, anahtarı temizle.
- Geliştirirken ilk N satırla çalış, adımı sonra sil.
- Tasarımdan önce ölç: tanılama yoksa “yavaş” bir his olarak kalır.