Mysql Toplu Veri Güncelleme (30M Kadar)
-
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.
-
SQL fiddle atar mısın hocam söylediğinden bir şey anlamadım belki sabahtır diye ama.
-
İşleyişi anlamadım fakat entity framework bulk insert mevzusu var. Onunla toplu veri kaydetme işlemi rahat yapılabiliyor diye hatırlıyorum.
-
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.
-
sql fiddle => http://sqlfiddle.com/#!9/3d087a
-
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.
-
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
-
ise yaradi mi
-
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ı)