folder Tahribat.com Forumları
linefolder Database - Veritabanı
linefolder Mysql Toplu Veri Güncelleme (30M Kadar)



Mysql Toplu Veri Güncelleme (30M Kadar)

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    coder2
    coder2's avatar
    Kayıt Tarihi: 15/Mart/2007
    Erkek

    Merhaba arkadaşlar,

    Sunucu linux olduğu için php veya python dillerini kullanabilirim veya mysql içinde bu işi halledebilirim.

    sql kod yapım ; 

    CREATE TABLE `deneme` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `alan1` int(11) NOT NULL,
      `alan2` int(11) NOT NULL,
      `alan3` int(11) NOT NULL,
      `alan4` int(11) NOT NULL,
      `alan5` int(11) NOT NULL,
      `alan6` int(11) NOT NULL,
      `toplam` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `alan1FK` (`alan1`)
    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    
    CREATE TABLE `oranlar` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `oran` int(11) NOT NULL,
      PRIMARY KEY (`id`),
      KEY `oran` (`oran`)
    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    
    
    INSERT INTO `deneme`(`id`, `alan1`, `alan2`, `alan3`, `alan4`, `alan5`, `alan6`, `toplam`) VALUES (1, 1, 2, 1, 2, 1, 2, 45);
    INSERT INTO `deneme`(`id`, `alan1`, `alan2`, `alan3`, `alan4`, `alan5`, `alan6`, `toplam`) VALUES (2, 1, 1, 1, 1, 1, 1, 30);
    INSERT INTO `deneme`(`id`, `alan1`, `alan2`, `alan3`, `alan4`, `alan5`, `alan6`, `toplam`) VALUES (3, 2, 2, 2, 2, 2, 2, 60);
    INSERT INTO `deneme`(`id`, `alan1`, `alan2`, `alan3`, `alan4`, `alan5`, `alan6`, `toplam`) VALUES (4, 0, 0, 0, 0, 0, 0, NULL);
    
    
    INSERT INTO `oranlar`(`id`, `oran`) VALUES (4, 0);
    INSERT INTO `oranlar`(`id`, `oran`) VALUES (1, 5);
    INSERT INTO `oranlar`(`id`, `oran`) VALUES (2, 10);
    INSERT INTO `oranlar`(`id`, `oran`) VALUES (3, 15);
    

     

    Kodların paste.ubuntu linki => https://paste.ubuntu.com/p/Hh3mzdV5CZ/  

     

    Deneme tablomdaki alan1-alan2....alan6 kısımları oranlar tablomda bulunan id leri tutuyorlar. Deneme tablomdaki toplam alanını bulmak için alan1-6 da bulunan id leri  oranlar tablomda buluyor ve oranlarını alıp 6 oranı topluyorum. Sonrada Deneme tablosundaki toplam kolonuna yazıyorum.

    Oranlar tablomda fazla veri olmuyor (100 civarı rows) fakat deneme tablomda 30 milyon kadar kayıt var.

    Nasıl yapabilirim fikir veren olursa sevinirim.

     

    coder2 tarafından 23/Eki/18 07:30 tarihinde düzenlenmiştir

    Önceleri Kızlar Utanınca Kızarırdı Şimdilerde Kızarınca Utanıyorlar..
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    MhmdAlmz
    MhmdAlmz's avatar
    Kayıt Tarihi: 09/Ağustos/2015
    Erkek

    SQL fiddle atar mısın hocam söylediğinden bir şey anlamadım belki sabahtır diye ama.


    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!
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    camarade
    ontedi
    ontedi's avatar
    Kayıt Tarihi: 04/Eylül/2005
    Erkek

    İşleyişi anlamadım fakat entity framework bulk insert mevzusu var. Onunla toplu veri kaydetme işlemi rahat yapılabiliyor diye hatırlıyorum.


    Matematikçi ve Yazılımcı. http://www.ontedi.com ve http://www.cizgi.site Siteme beklerim herkesi.
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    coder2
    coder2's avatar
    Kayıt Tarihi: 15/Mart/2007
    Erkek

    Akşam PC başına geçince diagram vs atarım konuya.

     

    veriler tablosunda d1..d6 kolonlarına bilgiler tablosundaki id ler kaydediliyor. Ve veriler tablosundaki toplam kolonuna bildiler tablosundaki bu id lerin olduğun satırdaki deger bolümlerinin toplamları yazılıyor. 

    Bilgiler tablosunda bulunan değer sütünü belirli zamanlarda değişiyor. Ve bu değişince doğal olarak veriler tablomdaki sonuçlarında değişmesi gerekiyor.

     

    Veriler tablosu 

    İd

    D1

    D2

    D3

    D4

    D5

    D6

    Toplam

    1

    1

    3

    3

    2

    1

    1

     

    2

    3

    2

    2

    1

    2

    3

     

     

    Değerler tablosu 

    İd

    Değer

    1

    10

    2

    8

    3

    20

     

    Burada veriler tablosu 1. Satır toplam alanına 78

    2. Satır toplam alanına ise 74 geliyor. 

     

    Değerler tablosundaki değer alanı değişince veriler tablosundaki toplam kısmınında değişmesi lazım.

    Burada önemli bir noktada şu değerler tablosunda değişiklik yapınca tek satır değil tüm satırları güncelliyoruz. Doğal olarak her satır değişince trigger çalışmayacak tablodaki tüm satırları güncelleneceğim ve ondan sonda veriler tablosu yeni sonuçlara göre toplam alanını atayacak.


    Önceleri Kızlar Utanınca Kızarırdı Şimdilerde Kızarınca Utanıyorlar..
  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    coder2
    coder2's avatar
    Kayıt Tarihi: 15/Mart/2007
    Erkek

    sql fiddle => http://sqlfiddle.com/#!9/3d087a 


    Önceleri Kızlar Utanınca Kızarırdı Şimdilerde Kızarınca Utanıyorlar..
  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    coder2
    coder2's avatar
    Kayıt Tarihi: 15/Mart/2007
    Erkek

    Hem up olsun hemde sql kodlarını ekledim. Bugün akşam bu konuyu çozmem lazım onun için fikirleriniz benim için onemli.

    Sunucu linux olduğu için php veya python dillerini kullanabilirim veya mysql içinde bu işi halledebilirim.

    sql kod yapım ; 

    CREATE TABLE `deneme` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `alan1` int(11) NOT NULL,
      `alan2` int(11) NOT NULL,
      `alan3` int(11) NOT NULL,
      `alan4` int(11) NOT NULL,
      `alan5` int(11) NOT NULL,
      `alan6` int(11) NOT NULL,
      `toplam` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `alan1FK` (`alan1`)
    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    
    CREATE TABLE `oranlar` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `oran` int(11) NOT NULL,
      PRIMARY KEY (`id`),
      KEY `oran` (`oran`)
    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    
    
    INSERT INTO `deneme`(`id`, `alan1`, `alan2`, `alan3`, `alan4`, `alan5`, `alan6`, `toplam`) VALUES (1, 1, 2, 1, 2, 1, 2, 45);
    INSERT INTO `deneme`(`id`, `alan1`, `alan2`, `alan3`, `alan4`, `alan5`, `alan6`, `toplam`) VALUES (2, 1, 1, 1, 1, 1, 1, 30);
    INSERT INTO `deneme`(`id`, `alan1`, `alan2`, `alan3`, `alan4`, `alan5`, `alan6`, `toplam`) VALUES (3, 2, 2, 2, 2, 2, 2, 60);
    INSERT INTO `deneme`(`id`, `alan1`, `alan2`, `alan3`, `alan4`, `alan5`, `alan6`, `toplam`) VALUES (4, 0, 0, 0, 0, 0, 0, NULL);
    
    
    INSERT INTO `oranlar`(`id`, `oran`) VALUES (4, 0);
    INSERT INTO `oranlar`(`id`, `oran`) VALUES (1, 5);
    INSERT INTO `oranlar`(`id`, `oran`) VALUES (2, 10);
    INSERT INTO `oranlar`(`id`, `oran`) VALUES (3, 15);
    

     

    Kodların paste.ubuntu linki => https://paste.ubuntu.com/p/Hh3mzdV5CZ/  

     

    Deneme tablomdaki alan1-alan2....alan6 kısımları oranlar tablomda bulunan id leri tutuyorlar. Deneme tablomdaki toplam alanını bulmak için alan1-6 da bulunan id leri  oranlar tablomda buluyor ve oranlarını alıp 6 oranı topluyorum. Sonrada Deneme tablosundaki toplam kolonuna yazıyorum.

    Oranlar tablomda fazla veri olmuyor (100 civarı rows) fakat deneme tablomda 30 milyon kadar kayıt var.

    Nasıl yapabilirim fikir veren olursa sevinirim.


    Önceleri Kızlar Utanınca Kızarırdı Şimdilerde Kızarınca Utanıyorlar..
  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    wert
    wert's avatar
    Kayıt Tarihi: 19/Eylül/2005
    Erkek
    update deneme
    
    LEFT JOIN
    (SELECT * from oranlar) as oran1 on deneme.alan1=oran1.id
    LEFT JOIN
    (SELECT * from oranlar) as oran2 on deneme.alan2=oran2.id
    LEFT JOIN
    (SELECT * from oranlar) as oran3 on deneme.alan3=oran3.id
    LEFT JOIN
    (SELECT * from oranlar) as oran4 on deneme.alan4=oran4.id
    LEFT JOIN
    (SELECT * from oranlar) as oran5 on deneme.alan5=oran5.id
    LEFT JOIN
    (SELECT * from oranlar) as oran6 on deneme.alan6=oran6.id
    
    set toplam=(oran1.oran+oran2.oran+oran3.oran+oran4.oran+oran5.oran+oran6.oran)

     

    işine yararmı denermisin verdiğin örnekte çalıştı gibi


    |sadece aptalların başarısı ders notu ile ölçülür|
  8. KısayolKısayol reportŞikayet pmÖzel Mesaj
    wert
    wert's avatar
    Kayıt Tarihi: 19/Eylül/2005
    Erkek

    ise yaradi mi


    |sadece aptalların başarısı ders notu ile ölçülür|
  9. KısayolKısayol reportŞikayet pmÖzel Mesaj
    coder2
    coder2's avatar
    Kayıt Tarihi: 15/Mart/2007
    Erkek
    wert bunu yazdı

    ise yaradi mi

    Hocam SQL kodlarını navicat te Run edince sorunsuz çalıştı fakat toplam alanının güncellenmediğini gördüm.

    10-15 satır kayıt bulunan başla bir tabloda ayni kodları çalıştırdım güncelleme başarılı idi. Tam istediğim gibi hızlı ve doğru çalıştı.

    30m kayıt fazla diye mi güncelleme yapmadı acaba ? (700 sn falan çalıştı, hata vermedi fakat güncelleme de yapmadı)


    Önceleri Kızlar Utanınca Kızarırdı Şimdilerde Kızarınca Utanıyorlar..
Toplam Hit: 1729 Toplam Mesaj: 9
trigger update