Sql Server Multiple Query
-
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.
-
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.
-
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.
-
C# ta kullanabilecegin sqlbulkcopy sinifida var aklinda bulunsun toplu veri kopyalamak icin.
-
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 .
