Sql Server Multiple Query

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    MhmdAlmz
    MhmdAlmz's avatar
    Kayıt Tarihi: 09/Ağustos/2015
    Erkek

    Mürit ve Müridelerim 1 ay öncesinden beri çözemediğim sorunu çözdüm belki birilerine yardımcı olur...

    Şöyle bir sorunum vardı yaklaşık 60.000+ Datayı Veri tabanına işliyordum Insert/Update ve Database kitleniyordu haliyle. yaklaşık 45 Dakika boyunca Database'i kullanamıyordum.

    Bütün yolları denedim olmadı. Query Optimize edeyim dedim araştırmaya başladım...

    Normalde yazmış olduğum kod şu şekilde idi

    for(var Query in Querys){
    
    //Örnek Query Update Deneme SET AdSoyad="Deneme" Where ID=1453
    
    VeriTabaniSorguCalistir(Query);
    
    }

    Daha sonra anladım ki bunu yapmak saçma yani 3-5 sorgu için eyvalah da birden fazla olunca database kafayı yiyor..

    Her neyse araştırırken Transaction ile karşılaştım... 

    Transaction nedir ?

    Normalde Transaction sadece tek türde işlem yapıyor ( Insert/Update/Delete) . Fakat değişik kombinasyonlar kullanabilirsiniz..

    Transaction'da yapılan Xx.xxx işlemden sadece 1 tanesi bile yanlış olduğunda bütün Veritabanı eski haline döner... 

    Reel bir örnek verilecek olursa.

    Mesela bakkala gittiniz 2 Ekmek aldınız. Bakkalcı bey /hanım efendi size ekmeği uzattı sizde ona para vermeyi unuttunuz ve gittiniz. Bu durumda Bakkalın sahibi size ekmek satmış olmuyor. Siz bu ekmeği satmadığınız için Veritabanından stoğu azaltmak istemeyeceksiniz... Çünkü ürün satılmadı. Parası alınmadı.

    Kabaca şu şekilde gerçekleşiyor olay.

    Siz Insert into SatilanUrunler .... diye Satılan ürünün logunu insert ettiniz.

    Update Stok .... Stok dan düştünüz.

    Insert into KasaHareketleri .... ????? Burda siz insert etmediniz ve 1 kodunuz boşta kaldı ? Bu durumda hiçbir işlem gerçekleşmeyecek ve sanki ekmek satılmamış gibi olacaktır.

    Ve Gelelim EN BÜYÜK VE GÜZEL ÖZELLİĞİNE.

    Transaction Sizin yaptığınız işlemleri bir yığın gibi bellekte biriktirir ve zamanla sizin Veritabanını yormadan yavaş yavaş Insert/Delete/Update eder.. Parçadan bütüne Böl fethet mantığı..

    Benim kodum 45 DK da insert ederken Transaction ile 15 Dakikalara kadar azaldı.. Fakat bu benim için yetmedi..

    https://www.jokecamp.com/blog/make-your-sqlite-bulk-inserts-very-fast-in-c/ 

    Burdaki amcanın makalesinde 1 Milyon datayı 4 Saniyede insert ettiğini söylemiş Muhtemelen kullandığı cihaz hızlı .. 

    Bu yöntem de işime yaramadı araştırmalarıma devam ettim ve sonuç olarak 

    IN - CASE yöntemi ile update ettim sorgularımı..

    Kaynak olarak -> http://stackoverflow.com/a/41084025/4949524

    Yapmış olduğum 60.000 Insert Yaklaşık 15 Saniyede sonuç verdi. Buda bana şuanlık yeterli bir süre ..

    Kodum->

    RunnTheQuery(" UPDATE Deneme SET AdSoyad="Deneme" Where ID IN (Select ID from DenemeIdleri where IsActive =1 Limit 1453 );"

    Mysql de DB MARİA Hatası alırsanız da Şu yolu deneyin. 

    Ilk önce ID leri veritabanından çekin 

    RunnTheQuery(" UPDATE Deneme SET AdSoyad="Deneme" Where ID IN (".implode(',',$Udates).");"

    ve şu kodu çalıştırın işlem tamam :)

     

     

    Iyi Akşamlar.

     


    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 (ahiret dünyadan) 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 (doğru) yola koymadı mı? Seni bir yoksul iken zengin etmedi mi? Öyle ise, sakın yetime kahretme (onu horlama)! El açıp isteyeni de azarlama! Fakat Rabbinin nimetini anlat da anlat!
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    KuZeTaR
    KuZeTaR's avatar
    Kayıt Tarihi: 26/Aralık/2009
    Erkek

    Sadece merak ettiğim için soruyorum; Stored procedure denedin mi hocam ? Ben bu durumlarda bütün veriyi db'ye atıp procedure'de parse edip insert ediyorum, tabi 60.000 satır veri için hiç denemedim.

  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Amatör Üye
    masteryoda
    masteryoda's avatar
    Kayıt Tarihi: 15/Mayıs/2012
    Erkek

    myisam ın bildiğim transaction desteği yok innodb nin var. genelde kayıt sayısına göre değişmekle 1k, 10k yada kayıt sayısının %10 na ulaştığında commit etmek daha iyi bu tür işlemleri de stored procedure kullanarak yapmak hız kazandıracaktır sp e dışarıdan parametrleri vererek çalıştırabilirsin. yaptığın iş tablo yapısına göre değişmekle birlikte temp bir tabloya kayıtları senin istediğin sonucu  insert edip buradan gerçek tablona kayıtları aktarabilirsin.

  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Hannibal_King
    Hannibal_King's avatar
    Kayıt Tarihi: 22/Ağustos/2010
    Erkek

    C# ta kullanabilecegin sqlbulkcopy sinifida var aklinda bulunsun toplu veri kopyalamak icin.


    lrny.app
  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    MhmdAlmz
    MhmdAlmz's avatar
    Kayıt Tarihi: 09/Ağustos/2015
    Erkek

    Hannibal_king , hocam Php kullanıyorum

    masteryoda && kuzetar , hocam Stored procedure daha yavaş onu da denedim en hızlısı bu Thread ile birden fazla db login bile yaptırdım . 


    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 (ahiret dünyadan) 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 (doğru) yola koymadı mı? Seni bir yoksul iken zengin etmedi mi? Öyle ise, sakın yetime kahretme (onu horlama)! El açıp isteyeni de azarlama! Fakat Rabbinin nimetini anlat da anlat!
Toplam Hit: 1146 Toplam Mesaj: 5
sql