Hocalar Selam, Çalışan bir üretim makinesinden SQL'e veri kaydı yapıyorum. Geçmişe ynelik kayıtları kontrol ettiğimde eğerki tabloda kaydedilen veri 200-300 veri ve üstüyse veriyi grüntülemesi 3-4 dakika sürüyor. Çok yavaş çalışıyor. Okadar uzman değilim. Başlangıç seviyesi C# eğitimi aldım sadece. Verileri daha hızlı nasıl çekebilirim? Biraz araştırma yaptım bazıları "Stored Procedure" ile daha hızlı yapabileceğimi sylüyorlar. Şuan sistem çalıştığından 1-2 gün müdahale edemicem. Kendi yazdığım kod aşağıda ki gibi.. Bunu nasıl geliştirebilirim? private void TarihSorgu { if ConStringOlustur ; ilktarih = SQLDate ; sontarih = SQLDate ; string sorgu = string. Format("Select distinct( ) from where >=' ' and <=' ' ", AdiRecete, AdiTablo, AdiTarih, ilktarih, sontarih); OleDbConnection conn = new OleDbConnection ; conn. Open ; OleDbCommand command = new OleDbCommand ; OleDbDataReader or = command. ExecuteReader ; ListeRecete. Items. Clear ; ListeRecete. Items. Add ; while (or. Read or. Close ; conn. Close ; ListeRecete. SelectedIndex = 0; } Kurtla sevişen mazoşist koyun

1. Store Prosedure ile çekmen hızlandırır, bir de Entity Framework'e bakmanı tavsiye ederim, 2. Index kavramını araştır, "WHERE" koşulunda belirtmiş olduğun column'lara index ekle, 3. Veriyi JSON olarak tutarsan ve JSON olarak kullanırsan bir ihtimal daha hızlı olur, data str. vs kullanmaktansa

Hocam kod biraz karışık ama tamamı aşağıdaki gibi. public class Rapor : DataGridView { public delegate void GRIDLOGDelegate ; private void GRIDLOG { if { string o = new string ; Color o_clr = new Color ; o = Sira. ToString ; o_clr = Color. White; for (int i = 0; i < or. FieldCount; i++) { //if (or . ToString "True") // //else if (or . ToString "False") // //else if (i >= 2) { if (RaporData . IndexOf -1) else { List Secenek = new List ; List SecenekRenk = new List ; string Tmp_RaporData = RaporData . Substring(RaporData . IndexOf + 1); string tmp_sec; do { if (Tmp_RaporData. IndexOf != -1) { tmp_sec = Tmp_RaporData. Substring(0, Tmp_RaporData. IndexOf ; if (tmp_sec. IndexOf != -1) else SecenekRenk. Add ; Secenek. Add ; Tmp_RaporData = Tmp_RaporData. Substring(Tmp_RaporData. IndexOf + 1); } } while (Tmp_RaporData. IndexOf != -1); tmp_sec = Tmp_RaporData; if (tmp_sec. IndexOf != -1) else SecenekRenk. Add ; Secenek. Add ; //Secenek. Add ; if (or . ToString "False" || or . ToString "0") else if (or . ToString "True" || or . ToString "1") else } } else } this. Invoke => this. Rows. Add ; for (int i = 0; i < or. FieldCount; i++) } else } private Color RenkBul public delegate void DelGRIDLOGDelegate ; private void DelGRIDLOG public delegate void SayfaKaydetDelegate ; private void SayfaKaydetDegistir { if this. Invoke => SayfaKaydet. Visible = b)); else } public delegate void SayfaKapatDelegate ; private void SayfaKapatDegistir { if this. Invoke => SayfaKapat. Visible = b)); else } Thread YeniThread; private string con_str = ""; private string ilktarih=""; private string sontarih=""; private MonthCalendar _baslangicTarih = null; public MonthCalendar BaslangicTarih { get set } private MonthCalendar _bitisTarih = null; public MonthCalendar BitisTarih { get set } private ListBox _listeRecete = null; public ListBox ListeRecete { get set } private ListBox _listeZamanSecim = null; public ListBox ListeZamanSecim { get set } public string AyarUDL public string AdiTablo public string AdiRecete public string AdiTarih public string RaporData private Frame. Label _receteSorguButon = null; public Frame. Label ReceteSorguButon { get set } public Frame. Label SayfaKaydet public Frame. Label SayfaKapat public int DilSecenek private bool ListeZamanSecimEventTmm = false; private bool BasTarihEventTmm = false; private bool BitTarihEvenrTmm = false; private bool ListeReceteEventTmm = false; public string SQLWhereSarti = ""; private void ConStringOlustur { try { using (StreamReader sr = new StreamReader { string line; while ((line = sr. ReadLine != null) } } catch { if(DilSecenek 1) Console. WriteLine(string. Format(" dosyası bulunamadı. Lütfen Kontrol Ediniz.", AyarUDL)); else Console. WriteLine(string. Format(" file doesn't exist. Please Check File.", AyarUDL)); Console. WriteLine ; } } public Rapor public void ListBoxDoldur { ListeZamanDoldur ; if if if if //if // IlkSorgu ; } private void ListeZamanDoldur { if { if (DilSecenek 1) else } } private void IlkSorgu void ListeZamanSecim_SelectedIndexChanged void SorguYapTarih void SorguYapReceteYeni { if { if { if (ListeRecete. SelectedIndex!= -1) } else { YeniThread. Abort ; if (ListeRecete. SelectedIndex!= -1) } } else { if (ListeRecete. SelectedIndex!= -1) } } public void RaporOlustur { //throw new Exception ; SayfaKapatDegistir ; SayfaKaydetDegistir ; if ConStringOlustur ; string sorgu = string. Format("Select , ", AdiTarih, AdiRecete); if (RaporData. Length > 0) { for (int i = 0; i < RaporData. Length; i++) } sorgu += string. Format(" from where >= ' ' and <=' '", AdiTablo, AdiTarih, ilktarih, sontarih); SQLWhereSarti = string. Format(" >= ' ' and <=' '", AdiTarih, ilktarih, sontarih); if (ListSira!= 0) { sorgu += string. Format(" and = ' '", AdiRecete, abc); SQLWhereSarti += string. Format(" and = ' '", AdiRecete, abc); } sorgu += string. Format(" order by desc", AdiTarih); //SQLWhereSarti += string. Format(" order by desc", AdiTarih); OleDbConnection conn = new OleDbConnection ; conn. Open ; OleDbCommand command = new OleDbCommand ; OleDbDataReader or = command. ExecuteReader ; //this. Rows. Clear ; DelGRIDLOG ; int sira = 1; while (or. Read or. Close ; conn. Close ; SayfaKapatDegistir ; SayfaKaydetDegistir ; } private void TarihSorgu { if ConStringOlustur ; ilktarih = SQLDate ; sontarih = SQLDate ; string sorgu = string. Format("Select distinct( ) from where >=' ' and <=' ' ", AdiRecete, AdiTablo, AdiTarih, ilktarih, sontarih); OleDbConnection conn = new OleDbConnection ; conn. Open ; OleDbCommand command = new OleDbCommand ; OleDbDataReader or = command. ExecuteReader ; ListeRecete. Items. Clear ; ListeRecete. Items. Add ; while (or. Read or. Close ; conn. Close ; ListeRecete. SelectedIndex = 0; } private DateTime GunBasi { return Convert. ToDateTime(string. Format(" . . : : ", dt. Day, dt. Month, dt. Year,"00","00","00")); } private DateTime GunSonu { return Convert. ToDateTime(string. Format(" . . : : ", dt. Day, dt. Month, dt. Year, "23", "59", "59")); } private string SQLDate { return string. Format(" . . : : ", dt. Month. ToString , dt. Day. ToString , dt. Year. ToString , dt. Hour. ToString , dt. Minute. ToString , dt. Second. ToString ; } } Hocam zaman seçiminden aynı gün içerisinden ise kontrol edeceğim zamanı seçiyorum. (Son 15dk, 30dk, 1saat, 3saat, 12saat) Koddaki adı "ListeZamanSecim" İlk Tarih koddaki adı "BaslangicTarih" Son Tarih koddaki adı "BitisTarih" Referans Adı kısmının koddaki adı "ListeRecete" Raporu alınmış ne kadar referans varsa ismi buraya düşüyor. Kontrol etmek istediğim herhangi bir referans varsa ona tıklıyorum o isimdeki raporları getiriyor. C# kodum yukarıdaki gibi. Biraz karışık olabilir. :) Branxian tarafından 15/Şub/18 19:20 tarihinde düzenlenmiştir Kurtla sevişen mazoşist koyun

Sorguyu birde sunucuda dene? 3-4 dk bekliyor mu? Bence sorun SQL de değil C# da. Yazdığın algoritmayı incele. Fonksiyonda bir sıkıntı yok gibi duruyor. Hocalar hepinize teşekkürler. Sanırım benim c# algoritmasında sıkıntı var dediğini denedim. Veriyi çektiğim kadar beklemiyor. Çok hızlı bir şekilde veriyi çekebiliyorum. Bir daha baştan yazmaya çalışayım bu gece bari sakin kafayla. Kurtla sevişen mazoşist koyun

ilave olarak tablo adından sonra with yazman where sartındaki alanları indexlemek faydalı olacaktır. select from tabloadi with

Farklı bir çzüm olarak; Hocam SQL'de verilerin varsa Microsoft'un ücretsiz sunduğu "Report Builder (3.0)" diye bir porgram var. Raporu bunda oluştur IIS üzerinde çıkan RDL dosyasını publish edersin. Raporuda mis gibi okursun bence. la bi git xD çoğu konuyu okurum. çok azına post atarım :D çok nemliyse pm at.. kaanabak kardeşimm, seni unutmayacağım.. :(

MhmdAlmz bunu yazdı Sorguyu birde sunucuda dene? 3-4 dk bekliyor mu? Bence sorun SQL de değil C# da. Yazdığın algoritmayı incele. Fonksiyonda bir sıkıntı yok gibi duruyor. Hocalar hepinize teşekkürler. Sanırım benim c# algoritmasında sıkıntı var dediğini denedim. Veriyi çektiğim kadar beklemiyor. Çok hızlı bir şekilde veriyi çekebiliyorum. Bir daha baştan yazmaya çalışayım bu gece bari sakin kafayla. Kodu atarsan optimize edebiliriz Andolsun kuşluk vaktine ve dindiği zaman o geceye ki, Rabbin sana veda etmedi ve darılmadı! Ve kesinlikle senin için sonu nünden daha hayırlıdır. ileride Rabbin sana verecek de hoşnut olacaksın! O, seni bir yetim iken barındırmadı mı? Seni, yol bilmez iken yola koymadı mı? Seni bir yoksul iken zengin etmedi mi? yle ise, sakın yetime kahretme ! El açıp isteyeni de azarlama! Fakat Rabbinin nimetini anlat da anlat!

Programı şu şekilde değiştirdim. Algoritmada sıkıntı var sanırım. Şimdi sadece parametrik hale getirilmesi kaldı. Şuan 50.000'e yakın lçüm raporunu 1 saniye veya daha kısa bir sürede çekebiliyorum. Ama endüstriyel pc atom işlemcili. Onda nasıl tepki vericek bakalım grücez. :) Kodu aşağıda ki gibi yaptım. public Form1 SqlConnection con; SqlDataAdapter da; SqlCommand cmd; DataSet ds; void griddoldur private void Form1_Load Kurtla sevişen mazoşist koyun

Sorguyu birde sunucuda dene? 3-4 dk bekliyor mu? Bence sorun SQL de değil C# da. Yazdığın algoritmayı incele. Fonksiyonda bir sıkıntı yok gibi duruyor. Andolsun kuşluk vaktine ve dindiği zaman o geceye ki, Rabbin sana veda etmedi ve darılmadı! Ve kesinlikle senin için sonu nünden daha hayırlıdır. ileride Rabbin sana verecek de hoşnut olacaksın! O, seni bir yetim iken barındırmadı mı? Seni, yol bilmez iken yola koymadı mı? Seni bir yoksul iken zengin etmedi mi? yle ise, sakın yetime kahretme ! El açıp isteyeni de azarlama! Fakat Rabbinin nimetini anlat da anlat!

ListeRecete adlı değişkenin tipi List<> ise yerine HashSet'i kullanman daha performanslı olur. Can alıcı kısım ise SQL tablolarında index yok onun için yavaş geliyor ve sorgunda hata var :) Connection'ları açarken using bloğunda açman gerekir. Sebebi de using bloğu kullandığın nesnenin dispose edilmesini garanti eder. Şuan kullandığın gibi devam ederseniz kod bloğunda try-catch olsa bile command nesnen execute edilirken oluşacak bir hata, connection nesnenin kapatılmasını engelleyecektir. Veritabanını birden fazla kullanıcının tetiklediğini düşünürsek sıkıntı olabilir. Alttaki linklere gz atarsan ayrıntılı şekilde bilgi alabilirsin. https://docs.microsoft.com/tr-tr/dotnet/framework/data/adonet/sql-server-connection-pooling http://www.buraksenyurt.com/post/Connection-Pooling-in-Onemi-bsenyurt-com-dantry { using (SqlConnection con = new SqlConnection { using (SqlCommand cmd = new SqlCommand("select Count(0) from Hasta", con)) } } catch saybirs tarafından 15/Şub/18 19:05 tarihinde düzenlenmiştir

Sorgu kadar db de optimize olması lazım. Tabloda index tanımlı mı? 200 / 300 kayıt getirmek bir şey değil. Sorguda da büyük bir problem var gibi durmuyor. 3-4 dk çok fazla. Üst katmanlarda dataları for ile dnüp durum oynuyor olabilir misiniz? Başlangıç ve bitiş için bi timer koy kaç sn bekliyor merak ettim. Select distinct from AdiTablo where AdiTarih>=ilktarih and AdiTarih<=sontarih https://www.youtube.com/watch?v=WC3-71NKwPw