SQL Server

Devexpress Dashboard ve SQL Server’da Büyük Veri ile Dashboard Performansı

Merhabalar

Hem iş zekası hem de veritabanı performansında yeni bir yazı ile daha sizlerle birlikteyim.

Bu yazımızda daha önce “İş Zekası Uygulaması arayanlar için pratik çözüm Devexpress Dashboard”

İsimli makalemizde İş Zekası uygulamalarına alternatif pratik bir çözümden bahsetmiştim.

Devexpress’i diğer iş zekası uygulamalarından ayıran en temel özelliği data modelleri oluşturmadan doğrudan SQL cümlesi yazarak çok pratik şekillerde interaktif dashboardlar oluşturmayı sağlaması idi.

Aslında bunu yaparken de çok pratik bir yöntem kullanıyor ve siz aksini belirtmedikçe tüm işi veritabanı sunucuya yaptırıyor. Ona bir işi yaptırmak için ise onun dilinden iyi anlaması gerekiyor tabi.

Ne demek istediğimi şöyle anlatayım.

Elimizde 10 milyon satırlık bir satış verisi var. Ama biz bölgelere göre satışları getirmek istiyoruz. Yani 7 satırlık bir veri döndürmek istiyoruz. Bunu yapmak için 10 milyon satırı client bilgisayara çekmek yerine

“SELECT REGION,SUM(LINENET) AS TOTALSALE FROM WH_SALES GROUP BY REGION” diyerek toplamda aşağıdaki gibi 7 satırlık veri getirmek mümkün.

Yani biz aşağıdaki gibi bir dashboard yapacak olsaydık. Yani c# ya da benzeri bir uygulamada kendi dashboard ekranımızı yazacak olsaydık, burada

Bölgelere göre satış için :” SELECT REGION,SUM(LINENET) AS TOTALSALE  FROM WH_SALES  GROUP BY REGION”

Şubelere göre satış için:” SELECT BRANCH,SUM(LINENET) AS TOTALSALE  FROM WH_SALES GROUP BY BRANCH”

Ürün kategorilerine göre satış için:”SELECT CATEGORY_NAME1,SUM(LINENET) AS TOTALSALE FROM WH_SALES GROUP BY CATEGORY_NAME1”

Aylara göre satış için ise :”SELECT CATEGORY_NAME1,SUM(LINENET) AS TOTALSALE FROM WH_SALES GROUP BY CATEGORY_NAME1”

Sql cümlelerini kullanır ve grid ya da chart ların içini bu şekilde doldururduk.

İşte Devexpress Dashboard tam olarak bu basit mantıkla çalışıyor ve bizim grid ya da chart’lara sürükleyip bıraktığımız alanlara göre otomatik SQL cümlelerini oluşturuyor ve datanın tamamını çekmek yerine işi client’tan daha kuvvetli olan server üzerinde gerçekleştiriyor. Tabi datanın tamamını client üzerine çekmek de bir seçenek. Eğer sizin veriniz 50.000 satırdan büyük değilse bu yöntem bazen daha performanslı da olabiliyor. Şimdilik bizim konumuz büyük veri ile ilgili olduğu için burada server mode da çalışma üzerine konuşacağız. Zaten sistem default olarak da server mode’un da çalışıyor.

Hadi gelin bu dediğimi ispat edelim.

Yeni bir dashboard oluşturalım.

Burada kullandığım WH_SALES tablosu 10 milyondan fazla satır içeren bir tablo bu arada. İlerleyen bölümlerde bu tablo üzerinde performans denemeleri yapacağız.

Dashboard’umuza datasource ekledik.

Şimdi bölgelere göre satış için bir grid ekliyoruz.

Bu gride REGION alanını sürüklüyoruz. Bu sürükleme işleminden hemen önce SQL Profiler uygulamasını açıyoruz. Bu sayede arka planda hangi sql cümlesinin gittiğini görebileceğiz.

Bunun için management studio içinde Tools>SQL Server Profiler menüsüne tıklıyoruz.

Açılan ekranda File>New Trace diyoruz.

Bağlanacağımız sunucuyu seçiyoruz.

Run dediğimiz zaman artık arka planda çalışan SQL cümlelerini izleyebilecek durumdayız. Burada ben kendi makinemde olduğu için çalışan sadece benim uygulamam olacak ve gereksiz sorguları görmeyeceğim.

Şimdi tekrar dashboard designer ekranına dönüyoruz ve REGION alanını gride sürüklüyoruz.

Şimdi de profiler ekranına bakalım. Bakalım arka planda hangi sql cümlesi çalışmış.

Gördüğümüz gibi

“select “TBL0″.”REGION” from  (SELECT * FROM WH_SALES) “TBL0” group by “TBL0″.”REGION” sorgusu gitmiş durumda. Aslında bu sorgunun pratikte

“SELECT REGION FROM WH_SALES GROUP BY REGION” sorgusundan bir farkı yok. Görüldüğü gibi oldukça basit bir mantık çalıştırıyor arka planda. Tabi biz bunu görmediğimizden gözümüzde büyütüyoruz. Ama görüldüğü gibi çok pratik. Zaten devexpress i bu yüzden seviyorum. Herhangi bir performans sıkıntısında çözüm üretmeniz çok kolay. Zira sizin gibi düşünüyor.

Şimdi “REGION” alanının yanına toplam ciroyu da görmek için “LINENET” alanını da ekleyelim ve profiler’dan hangi sorgunun gittiğine yine bakalım.

Evet şimdi de sorguya LINENET alanını ekledi ve getirdi.

select “TBL0″.”REGION”,sum(“TBL0″.”LINENET”) from  (SELECT * FROM WH_SALES) “TBL0”  group by “TBL0″.”REGION”

Burada duration alanı sorgunun gelme süresini gösteriyor. Sadece bölgelerin satış cirosu için geçen süre 5.7 sn. Buraya yukarıdaki başka bölümleri de getirdiğimizde bu raporun gelme süresi oldukça artacaktır. Şimdi diğer alanların da eklenmiş halini çalıştıralım ve profiler dan bakalım.

Profiler ekranından baktığımızda duration alanları görüldüğü gibi

5.690+5.843+5.830+5.665=23.028 ms=23 saniye sürüyor.

Aynı bilgiyi ekranın en üstündeki starttime ile en altındaki endtime alanlarının farkından da çıkarabiliriz. Sonuç itibariyle raporun çalışması 23 saniye sürüyor.

Bir rapor ekranı için bence uzun bir süre. Hele bir de bu rapor interaktif bir ekran olacak ise, yani ben raporda bölgelere tıkladığımda tüm rapor o bölgeye göre filtrelensin istiyorsam her seferinde bu kadar beklemem gerekir.

İşte bu noktada bu sorguları analiz ederek işi hızlandırmaya bakalım.

Şimdi bu sorguları sırası ile alıp Management Studio ya yapıştıracağız, sorgunun performansına bakacağız ve iyileştirmeye çalışacağız.

İlk sorgumuz ile başlayalım.

Sorgumuz 10 milyon satırdan 7 satır getirdi ve sonucun gelmesi 6 saniye sürdü.

Şimdi bakalım ne kadar okuma yapmış?

SET STATISTICS IO ON komutu ne kadarlık okuma yaptığı bilgisini gösteriyordu. Messages bölümünden de ona bakacak olursak;

379.711 tane page okuduğunu görüyoruz. Her bir page 8 KB ise

379.711*8/1024/1024=2.89 GB veri okuduğunu görebiliyoruz. Gerçekten hatırı sayılır bir okuma tek bir sorgu için.

Şimdi execution plana bakalım ve hangi indexi kullanarak çalıştığını görelim.

Bu arada tablomuzda primary key dışında indeximiz yok.

Display Estimated Execution Plan diyoruz ve execution plana bakıyoruz.

Kullanacak başka index olmadığı için haliyle primary key üzerinden arama yapmış.

Herhangi bir index önerisinde de bulunmuyor. SQL Server bazen bu index önerisi işinde çok başarılı iken bazen de önermiyor. Ama burada kendimiz bir index oluşturmayı deneyelim. Örneğin REGION alanına göre ve LINENET alanını da include edecek şekilde bir index oluşturalım.

Şimdi bakalım execution plana.

Bizim eklediğimiz indexi kullanmaya başladı.

Şimdi de sorgumuzu çalıştırarak sorgumuza bakalım.

Bu kez sorgu 2 saniyede geldi. Önceki süre 6 idi. Süremiz 3 kat kısaldı. Şimdi okunan page sayısına bakalım.

Okunan page sayısı da 41.165 önceki 379.711 idi. Bu da yaklaşık 10 katlık bir okuma iyileşmesi anlamına geliyor. Yani diskimizi 10 kat daha az yoruyoruz ve toplamda 2.89 GB yerine 0.3 GB veri okuyoruz.

Gelelim ikinci bölümde illere göre satış gridine.

O da aynı sayıda page okuyor ve 6 saniye sürüyor. 2.9 GB da bu dersek şu an iki grid için index olmaz ise 5.8 GB okuma söz konusu.

Şimdi buraya da index koyalım.

Burada da yine 6 saniyelik süre 2 saniyeye 379.686 adet okuma 48.348’e düştü.

Diğer iki ekran için de CATEGORY_NAME1 ve DATE_ alanlarına göre index ekliyoruz.

Şimdi dashboard’umuzu tekrar çalıştıralım ve profiler’dan bakalım.

Görüldüğü gibi sürelerin toplamı

2.376+2.477+2.151+2.171=9.175 ms=9 saniye’ye düştü.

Eskisi 23 saniye idi.

Böyle bir ekranı görmek için 9 saniye beklemek fena bir bekleme değil. Zira gerçek zamanlı olarak 10 milyon satırlık bir tablodan kayıt çekiyoruz.

Ama asıl sorun interaktif olarak çalışmak istediğimizde ortaya çıkıyor. Yani ben her bölgeye tıkladığımda rapor ona göre filtrelensin istersem her seferinde bu kadar beklemek güzel olmayacaktır.

Hadi gelin şimdi deneyelim.

Marmara bölgesine tıkladığımda raporda sadece Marmara Bölgesi’nin verilerinin gelmesini istiyorum.

Bunun için en baştaki grid’i seçip master filter olarak işaretliyorum.

Bu işlemi yaptıktan sonra Marmara Bölgesini seçiyorum ve raporumda her şey değişiyor.

Profiler’a tekrar bakıyoruz.

Raporu filtrelemek istememe rağmen süreler uzadı.

İşte bu hiç kullanışlı değil. Peki şimdi profiler’dan giden sorguya bakalım.

Birinci sorgu bu şekilde.

select “TBL0″.”BRANCH”,sum(“TBL0″.”LINENET”) from  (SELECT *  FROM [WHTIGER].[dbo].[WH_SALES]

) “TBL0”

where (“TBL0″.”REGION” = N’Marmara’)

group by “TBL0″.”BRANCH”

Burada görüldüğü gibi sistem otomatik olarak filtrelenecek bilgiyi içeren sorguyu sunucuya gönderiyor.

Şimdi bu sorguyu management studio’ya yapıştırıp display estimated execution plan dediğimizde

Sistem bu kez bize bir index önerisinde bulunuyor.

Bu önerinin scriptini almak için execution plan üzerinde missing index detail diyoruz.

Ve bize scripti çıkartıyor.

Indeximize IX5 ismini vererek çalıştırıyoruz ve sorgumuza bakıyoruz. Sorgumuz 2 sn de geldi bu kez.

Şimdi ikinci sorgumuza bakıyoruz.

select “TBL0”.”CATEGORY_NAME1″,sum(“TBL0″.”LINENET”) from  (SELECT *

  FROM [WHTIGER].[dbo].[WH_SALES]

) “TBL0”

where (“TBL0″.”REGION” = N’Marmara’)

group by “TBL0”.”CATEGORY_NAME1″

Onda da index önerdi.

Şimdi sorgumuzu tekrar çalıştırıyoruz.

Onda da iyileştirme söz konusu.

Şimdi sırada aylara göre satışları çektiğimiz gridimiz var.

Onun sorgusuna bakıyoruz. O da index öneriyor.

Onun da scriptini çalıştırıyoruz.

Gözle görülür bir iyileşme burada da var.

Şimdi asıl iyileşme olup olmadığını anlayacağımız yer dashboard’un kendisi. Yani kullanıcı ekranı. Ona bakalım. Profiler’ı temizleyip tekrardan Marmara bölgesini seçiyoruz.

Bölgeye tıkladığımızda geçen süreler

1.643+1.500+1.084=4.227 ms=4.2 saniye. Önceki 13 saniye idi hatırlarsanız.

Bu tarz bir işlemde 13 saniye beklemek can sıkar ama 4 saniye o kadar üzmez. Kullanıcı interaktif bir şekilde raporlarını çekebilir.

Özetle

Bu yazımızda 10 milyon satırlık bir perakende satış datasında gerçek zamanlı çalışan interaktif bir dashboard ekranını yapılacak ufak tefek küçük dokunuşlar ile nasıl performanslı çalıştırabileceğimizi görmüş olduk.

Umarım faydalı bir yazı olmuştur.

Sağlıcakla…

İlgili Makaleler

12 Yorum

  1. Eline sağlık hocam, Devexpress Dashboard’ı üretim hatlarında Andon ekranlarda bir çok yerde kullanıyorum ve bu ekranlara yeni bir soluk getiriyor. Bir çok farklı alanda da sizin anlattığınız gibi kullanabiliyoruz. Kod yazmadan bunları yapabilmesi bizim gibi yazılımcıların işini elinden alsada zaten süreç buraya doğru veriliyor.

  2. Rica ederim. Devexpress dashboard u gördüysen ve yazılımcıysan zaten ilk tepki vay beee bu zamana kadar ile başlayan çeşitli varyasyonlarda cümleler oluyor 🙂
    Çok memnun oldum aktif kullanmana. Az biliniyor ama bilen de bir daha bırakmıyor.
    Başarılar dilerim.

    1. Emeğinize sağlık sizin eğitimleriniz den çok faydalandım. Dasboard öğrenmeye başladım. İlk izlenimim mükemmel bir şey.

  3. İlk izlenim iyi olsa da o bir BI uygulaması değil malesef. Modelleme özelliğini içinde barındırmıyor yani farklı veri kaynaklarını tek rapor içinde birbirinden etkilenecek şekilde filtreleme yapmak konusunda oldukça kısıtlı. Fiyat/performans açısından iyi bir ürün olsa dahi ihtiyaçları iyi değerlendirip ona göre karar vermek gerekir

  4. Kadir Bey merhaba,
    Bir kaç açıklama yapmak isterim.
    BI uygulaması değil demek çok insafsızca olur açıkçası. Ben burada çok basitçe anlattım çok detaylara girmedim. Modelleme yok değil aslında var ama bu ihtiyaca göre değişir. Örneğin ben modelleme ihtiyacı duymuyorum. Çünkü bunu db tarafında yapabilecek bilgiye sahibim. Bu da bana ekstra donaım kaynağı noktasında kazanç sağlıyor.

    Özellikle kobi segmentinde firmalar için BI uygulaması geliştirmek sıkıntılı. Eleman istihdam edemiyor model vs geliştirme için. Ayrıca hem donanım hem lisans için ekstra bütçeler yok.

    Farklı veri kaynaklarını tek dashboard üzerinde kullanabiliyor olması benim en beğendiğim özelliklerden. Örneğin aylara göre dondurma satışına baktığınız bir satış datanız var bir de aylara göre sıcaklık bilgisini ölçen datanız var. İkisi farklı database lerde bile olabilir. Sadece alan isimleri aynı ise sistem otomatik olarak ikisini entegre ediyor. Siz eşleştirme bile yapmıyorsunuz.

    Ve tabi en önemli özelliği yazılımlarınıza entegre oluyor olması.
    Bence fiyat/performans ürünü olmanın biraz daha ötesinde.

  5. Bundan tam 6 sene önce DevExpress’le ilk tanıştığımda vay beee şu eklentiyi ülkemizde öğreten bir hoca yok diye içerlenmiştim. Yine aynı şekilde SQL sorgulama örnekleri yapan ve analiz eğitimi veren de yok diye iyice umudumu kesmiştim ama bu gün sizin sayenizde yabancı dillerden çevirmeye gerek kalmadan hızlı bir şekilde öğrenmeye devam ediyorum. İlminize kuvvet hocam teşekkürler.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu