Bilmek istediğin her şeye ulaş

Asp.Net (aspx)'te veritabanından çekmiş olduğum verileri for döngüsü ile taratıp gerekli işlemlerden geçiriyorum. Fakat bu sorgu içerisinde 7000+ tane kadar veri var ve sayfamın tepki süresini çok arttırıyor. Önerebileceğiniz çözümler ya da araçlar nelerdir?

server 2008 r2 üzerinde koşan sql server içerisinde store procedure ile asp.net ortamında oluşturmuş olduğum fonksiyon ile verileri çekiyorum. Veriler datatable içerisinde geliyor ve ben, tek tek tüm satırları taratıp, html içerisine yerleştiriyor ya da json datalarına çeviriyorum. Tepki süresini kısaltmak için nasıl bir yöntem izlemeliyim... Teşekkürler.Düzenle
Önce sayfanın yanıt vermesini yavaşlatan şeyin ne olduğunu bulmanız gerekir.

Verinin çekilmesi mi, yoksa işlenmesi mi?

1- View'i optimize edin. 7000 kayıt dönmemeli. Endekslerinizi kontrol edin. Çok büyük ihtimalle sizi asıl yavaşlatan verinin veritabanından çekilmesi sürecidir.

2- Kodu optimize edin. Bu 7000 kaydı işlerken kullandığınız döngü mantığı bile sizi yavaşlatabilir. Sonuçta her kayıt için bir tane string manipülasyon işlemi varsa bunun yanıtı geciktirmesi çok normal.

3- Mantığı optimize edin. O 7000 kayda gerçekten ihtiyacınız var mi? Yoksa mesela 10 tane yetiyor mu? Bu kayıtları çekip koşullara göre manipüle etmek yerine manipüle edilmiş hallerini bir yerde saklamak mümkün mü?
  • Paylaş
Benzer bir sorunla geçen sene karşılaşmıştım. Hiç başka bir alternatifi olmadığı için büyük miktarda veriyi çekip satır bazında işlemlere tabi tutmam gerekiyordu. Birçok farkı denemeden sonra sorunu multi thread bir yapıyla hallettim. Tepki süresi çok ciddi miktarda azaldı. Yaptığım işlem adımları şu şekildeydi (kod bazında yardım isterseniz lütfen direk mesaj ile ulaşın).

  1. Toplu olarak veriyi çektim
  2. Veriyi örneğin 200'lük parçalara böldüm (toplam dönen kayıt sayısı / 200)
  3. Multi Thread bir fonksiyona bütün 200'lük paketleri arka arkaya gönderdim.
  4. Göndermiş olduğum paketlerin hepsinin sonuçları döndürmesini bekledim
  5. Bütün fonksiyon dönüşleri tamamlanınca veriyi sayfaya yönlendirdim.

200 rakamı tamamen varsayımsal, bu rakamı süreyi ölçerek ve optimize ederek geliştirebilirsin.

Normalde 7000 kayıt için işlem süresinin 70 saniye olduğunu varsayalım ve
diyelim ki bu kayıtları 500'lük paketlere böldün. Normalde ortalama 100 kayıt 1 saniyede hesaplanırsa multi thread işleminden sonra toplam dönüş süren teorik olarak 5 saniyenin biraz üstünde olacaktır. Azımsanamayacak bir fark değil mi? Yalnız uyarayım bu işlem CPU'yu çok ciddi kullanıyor. Server'daki CPU kullanımının buna elverişli olması gerek yani.
  • Paylaş
Nasıl bir durumda 7000'den fazla veriyi çekmeye ihtiyaç duyduğunuzu anlayamadım ancak bu durumda en çok dikkat etmeniz gereken şey SQL sorgusunu optimize etmektir.

Toplam sürenin büyük kısmı SQL tarafında harcanıyordur, öyle değil mi?

Eğer SQL tarafında sorununuz yoksa ama gelen verileri döngüde işlerken çok zaman harcıyor ise bence ilk iş hangi işlem satırında çok zaman harcandığını tespit etmektir.

Elimde kod olmadığı için bir yorum yapamıyorum çok şu an. Ama kod örneklerinizi online olarak pastebin.com veya buna benzer siteler üzerinden gönderirseniz bakıp daha detaylı yorum yapabiliriz.
  • Paylaş
6

Birkan Aydin, Allahsız tib pastebin.com u da kapatmış :) yıllık bazda dakikalık veriler görmek isteyen müşterilerimiz olduğundan dolayı bu kadar yüksek boyutlardaki verilerle karşı karşıya kalıyorum. Büyük olasılıkla döngülerden kaynaklı bir sorun gibi geliyor bana, tavsiyeleriniz üzerine tekrardan kontrollerimi yapayım. Konu ile ilgili olarak sizden tekrar yardım talep edeceğimdir. Teşekkürler.

Hakan Köse, Rica ederim. Yandex DNS'lerini kullanırsanız pastebin çalışır.. Ben az önce girebildim, yasaklandığını bilmiyordum..

Birkan Aydin, Abi ben şöyle bir salaklık yapmışım, html table 'la oluşturduğum bu veriyi, string üzerinde toplata toplata gitmişim e oda haliyle almış başını gitmiş, yavaşlama sebebi ondan kaynaklanıyor gibi geliyor bana, parse işlemleri falanda var hatrı sayılır şekilde, epey kötü kodlamışım ben bunu... Şimdi html 'i nasıl bastırayım ben, json datasını da string olarak gönderiyorum. Nasıl çözüm getirebilirim. json datasını string olmadan nasıl göndereceğim ben

Hakan Köse, Nereden nereye data göndermek istiyorsun?

Birkan Aydin, Şöyle ki, asp.net 'de sql sorgusu ile data bana geliyor, ben bu datayı hem JavaScriptSerializer ile işleyip chart'a basıyorum. Hemde bu verileri bir string değişgeninde html kodları ile toplayıp(örn. <td>123</td> gibi), response.write ile ekrana basıyorum. ama raporlama esnasında bir aylık veri seçildiğinde muazzam büyüklükte datalar oluşuyor.

Hakan Köse, Neden bir Repeater kullanarak veriyi ekranda göstermiyorsunuz? Yani HTML kodunu kod tarafında generate etmeye ne gerek var ki?

Ayrıca, Chart için huge data bile olsa HighCharts kullanabilirsiniz (highcharts.com) çok iyidir. Aynı şekilde chart kısmında gösterilecek datayı da sayfaya bağlayıp grafikleri generate işini highcharts'a bırakabilirsiniz.

Sonraki Soru
HESAP OLUŞTUR

İstatistikler

542 Görüntülenme6 Takipçi3 Yanıt