• 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.

Soru Büyük Veride Kasmayan Çok Kriterli Benzersiz Sayım

saliya

Yeni Üye
Aktivite

0%

Katılım
2 May 2024
Mesajlar
2
Aldığı beğeni
0
Excel V
Office 2016 TR
Konu Sahibi
Windows 10 Google Chrome 151
Herkese merhaba, iyi forumlar.
Şirket verilerimiz büyüdükçe standart Excel formülleri hesaplama yaparken kilitlenmeye, %100 CPU tüketerek dosyayı çökertmeye başladı. Yaşadığım bu performans sorununa en optimize çözümü bulabilmek adına foruma konusuny açmak istedim.
Ekte paylaştığım buyuk_veri_test.xlsx dosyasında örnek bir satış veri seti bulunuyor. Yapmak istediğim şey şu:
  • Yıl: 2026
  • Bölge: Marmara
  • Ürün Grubu: Elektronik
Bu 3 kritere uyan satırlardaki BENZERSİZ (Unique) Müşteri Sayısını bulmak istiyorum (Aynı müşteri birden fazla alışveriş yaptığı için satırlarda tekrar ediyor, onları tek saymalı).
Forumdaki değerli hocalarımıza ve üstatlarımıza sormak istiyorum; dosyanın kasılmasını engellemek ve en yüksek performansı almak için sizce hangi mimariyi kurmalıyız?
  1. Formüllerle: BENZERSİZ (UNIQUE) ve FİLTRE (FILTER) gibi yeni nesil 365 formüllerini iç içe kullanarak mı?
  2. VBA / Makro ile: Hafızada çalışan Scripting.Dictionary ya da Collection nesneli dizi (Array) mimarisiyle mi?
  3. Power Query / Power Pivot ile: Veriyi Veri Modeline alıp DAX fonksiyonlarındaki DISTINCTCOUNT yöntemiyle mi?
Hocalarımız ekteki test dosyası üzerinde kendi yazdıkları yöntemlerin kaç saniyede sonuç verdiğini (hız testini) kod veya formül olarak paylaşabilirse, büyük veriyle çalışan herkes için harika bir rehber konu olacaktır.

Şimdiden çok ama çok teşekkür ederim.
 

Ekli dosyalar

Windows 10 Opera 134
Ekteki dosyayı kontrol ettim. Veri setinde 500 satış kaydı var. Verdiğiniz üç kriteri birlikte uyguladığımızda 43 satır eşleşiyor ve bunların içindeki benzersiz müşteri sayısı 29.

Dolayısıyla beklenen sonuç:

2026 + Marmara + Elektronik → 29 benzersiz müşteri

Performans açısından da üç yöntemi aynı dosya üzerinde karşılaştırmak çok güzel bir forum testi olur. Ancak 500 satır gerçek performans farkını göstermek için oldukça küçük; 100 bin, 500 bin ve 1 milyon satırlık testler oluşturup UNIQUE/FILTER, VBA Dictionary ve Power Pivot/DAX DISTINCTCOUNT yöntemlerini aynı şartlarda süre ölçerek karşılaştırmak çok daha anlamlı olur.
 
Windows 10 Opera 134
Mevcut dosyanızı temel alıp üç yöntemi yan yana karşılaştırabileceğiniz, süre ölçümlerinin de kaydedildiği bir benchmark çalışma kitabına bakabilirsiniz.
Temel test ölçeğini 100.000 satır olarak kuruyorum; aynı veri üzerinde 10.000 / 50.000 / 100.000 satır seviyelerini ayrı ayrı ölçebileceksiniz. Böylece dosya gereksiz yere devleşmeden ölçek büyüdükçe performans eğilimi görülebilecek.

Dosyada kaynak Sheet1 aynen korunuyor. Ayrıca Benchmark, VBA_Kodu ve PowerPivot_DAX sayfalarını ekledim. 2026 + Marmara + Elektronik için kontrol sonucu 29 benzersiz müşteri olarak yer alıyor.

VBA_Kodu sayfasında ayrıca 100.000 / 500.000 / 1.000.000 satırlık veri üretme, UNIQUE + FILTER süresini ölçme ve Array + Scripting.Dictionary benchmark kodları hazır. Dosya .xlsx olduğu için makro doğrudan gömülü değil; kodu VBA modülüne yapıştırıp .xlsm olarak kaydettiğinizde çalıştırabilirsiniz. PowerPivot_DAX sayfasında da DISTINCTCOUNT ölçüsü hazır.
 

Ekli dosyalar

Windows 10 Opera 134
Dosyada üç farklı yöntem var; önce Formül, sonra VBA, en son Power Pivot testini çalıştırmanız en kolay yol.

  1. Benchmark dosyasını açın. Excel 365 kullanıyorsanız önce Veri_100K sayfasına geçin. A2:E2 hücrelerinde dinamik formüller var; bunlar aşağı doğru otomatik taşarak yaklaşık 100.000 satırlık test verisi oluşturur. Birkaç saniye içinde veri görünmelidir.
  2. Sonra Benchmark sayfasına geçin. Sol tarafta kriterler:
    Yıl = 2026, Bölge = Marmara, Ürün Grubu = Elektronik.
    Sağ tarafta 10.000, 50.000 ve 100.000 satır için formül testi vardır. Sonuçların 29 çıkması gerekir. Burada kullanılan mantık UNIQUE + FILTER yöntemidir.
  3. VBA testini çalıştırmak için önce dosyayı makrolu formata çevirin. Excel'de Dosya → Farklı Kaydet → Excel Makro Etkin Çalışma Kitabı (*.xlsm) seçin. Örneğin buyuk_veri_benchmark.xlsm olarak kaydedin.
  4. Ardından VBA_Kodu sayfasına gidin. Orada bulunan kodun tamamını kopyalayın. Klavyeden Alt + F11 tuşlarına basın. VBA penceresinde Ekle → Modül seçin ve kodu açılan boş pencereye yapıştırın. Sonra VBA penceresini kapatabilirsiniz.
  5. Excel'e dönüp Alt + F8tuşlarına basın. İki önemli makro göreceksiniz:
    • BenchmarkFormula → Formül hesaplama süresini ölçer.
    • BenchmarkDictionary → VBA Array + Scripting.Dictionary yöntemini ölçer.

Önce BenchmarkFormula seçip Çalıştır, ardından BenchmarkDictionary seçip Çalıştır deyin. İşlem bittiğinde Benchmark sayfasına dönün; sonuç ve süre alanları doldurulmuş olacaktır.

Power Pivot için ise PowerPivot_DAX sayfasındaki yönergeleri kullanın. Temel ölçü şudur:

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


Sonra PivotTable'da 2026 / Marmara / Elektronik filtrelerini verdiğinizde sonuç yine 29 olmalı.


Ben ilk aşamada özellikle VBA Dictionary ile UNIQUE+FILTER'ı karşılaştırmanızı öneririm; kullanım açısından en kolay iki test bunlar.
 
Windows 10 Opera 134
Bu bağlantı ziyaretçiler için gizlenmiştir. Görmek için lütfen giriş yapın veya üye olun.

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

1 milyon satırda formül yaklaşık 0,922 saniye, VBA ise 0,637 saniye sürmüş. Yani VBA Dictionary bu testte yaklaşık %31 daha kısa sürede sonuç veriyor; başka ifadeyle formülün süresi VBA'nın yaklaşık 1,45 katı.


Daha önemlisi, ölçek büyüdükçe iki yöntem de oldukça düzgün ve yaklaşık doğrusal ilerliyor. Dolayısıyla burada Excel'in “kilitlenmesi” yalnızca bu tek sorgudan kaynaklanmıyor olabilir. Gerçek çalışma kitabınızda bu tip FILTER/UNIQUE formüllerinden çok sayıda varsa, her yeniden hesaplamada milyonlarca satırın tekrar tekrar taranması toplam CPU yükünü büyütür. VBA yaklaşımında ise hesabı yalnızca istediğiniz anda yaptırabilirsiniz.


Bu sonuçlara göre benim mimari tercihim şöyle olur: tek veya birkaç sorgu için VBA Array + Dictionary, sürekli raporlama ve çok büyük veri modeli için ise Power Pivot + DISTINCTCOUNT. Özellikle milyon satır ve çok sayıda farklı rapor/kriter söz konusuysa Power Pivot'ı da aynı benchmark'a dahil etmek önemli.


Bir sonraki testte benchmark'ı biraz daha profesyonel hale getirebiliriz: her yöntemi 10 kez otomatik çalıştırıp minimum, maksimum ve ortalama süreyi hesaplayalım. Tek ölçümde Windows/Excel'in o andaki yükü sonucu etkileyebilir; 10 koşunun ortalaması forumda paylaşmak için çok daha güvenilir bir sonuç verir.



Deneyiniz
 
Son düzenleme:
Konu Sahibi
Windows 10 Google Chrome 151
Çok teşekkür ederim, hocalarım

Başka çözümü olan hocalarımız olabilir mi?
 
Windows 10 Opera 134
Çözümler yukarda bilginize sunulmuştur. Burda önerilen çözümleri ve test dosyasını indirip denedinizmi

Bence forumdaki ana sonucu şu şekilde ifade etmek çok yerinde olur:


10 bin–100 bin satır: 365 formülleri kullanım kolaylığı açısından yeterli.
100 bin–1 milyon+ satır: iyi yazılmış Array + Scripting.Dictionary VBA, özellikle isteğe bağlı hesaplamalarda çok yüksek performans verir.
Milyonlarca satır ve çoklu raporlama: Power Pivot + DAX / DISTINCTCOUNT ölçeklenebilirlik açısından en uygun mimaridir.
 
Windows 10 Google Chrome 151
Çok teşekkür ederim, hocalarım

Başka çözümü olan hocalarımız olabilir mi?
1-milyonlarca satır verisi için pp+dax milisaniyelik süreç
2-100k ve üzeri için vba düzgün bir array+dict. ile pp+dax seviyesinde hızlı
3-10k-100k aralığı için formül
 
Windows 10 Google Chrome 149
Deneyiniz. Lütfen dönüş yapınız.

Excel çalışma sayfalarının teknik olarak maksimum satır sınırı 1.048.576 satırdır. Dolayısıyla bu kodla tek bir sayfada 1.048.575 kayıt (veri satırı) işleyebilirsiniz.
(NOT : Sayfa isimlerini değiştirmemelisiniz)
 

Ekli dosyalar

Geri
Üst