C#’da SQLite Veritabanına 1 Milyon Kayıt Ekleme (Toplu Kayıt Ekleme)

sdkbyrm

webmasterfrm
Üyelik Tarihi
23 Aralık 2020
Mesajlar
813
Beğeniler
1
Ticaret: 0 / 0 / 0
SQLite’de bir defada bir kayıt eklerseniz, bireysel transaction içine alınıp çalıştırılır. Toplu ekleme işlemlerinizi çok hızlı bir şekilde yapmak isterseniz yine aynı şekilde bir transaction içine alıp kayıt işlemini yapmanız gerekir. Bir kaç kayıt eklemede oluşan performans sorununu fark etmek zor ancak kayıt sayısı onbinleri bulduğunda performans sorunu kendisini gösterecektir.


Bu yazıda 1 milyon kayıt yaklaşık 3 saniye içinde veritabanına ekleyeceğiz. Buradaki 1 milyon kayıt ifadesi iddialı bir ifade fakat çoklu kayıt eklemelerde tek transaction kullanılması performans açısından bir zorunluluk oluşturmaktadır.

Visual Studio çalıştırıldıktan sonra, aşağıdaki gibi Nuget yardımı ile SQLite veritabanı DLL dosyası projeye dahil ediliyor.



SQlite-example-in-csharp-console.png




sqlite-dll-download-in-c-console.png




Yukarıdaki adımları yaptıktan sonra SQLite kütüphanesi projemizde olacak. Şimdi örnek veritabanını oluşturan kodları yazalım.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

SQLiteConnection con;
SQLiteCommand cmd;


con = new SQLiteConnection("Data Source=OrnekVt.sqlite;Version=3;");
string sql = @"CREATE TABLE IF NOT EXISTS Ogrenci(
OgrNo INTEGER PRIMARY KEY AUTOINCREMENT ,
Ad TEXT NOT NULL,
Soyad TEXT NOT NULL
);";

con.Open();
cmd = new SQLiteCommand(sql, con);
cmd.ExecuteNonQuery();


Örnek veritabanı oluşturulduktan başlıkta yazıldığı gibi 1 milyon kayıt nasıl ekleniyor bakalım. Süre için bir tane StopWatch nesnesi ve ardından veritabanına bağlanıp bir tane de transaction başlatıyoruz. Test için for döngüsü içinde 1 milyonluk bir döngü yapıp kayıtların eklenmesini sağlıyorum. Siz de kendi gerçek verilerinzile test edebilirsiniz.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

/* 1 Milyon kayıt ekleme*/

var stopwatch = new Stopwatch();
stopwatch.Start();
cmd = new SQLiteCommand();


using (cmd = new SQLiteCommand(con))
{
using (var transaction = con.BeginTransaction())
{
for (var i = 0; i < 1000000; i++)
{
cmd.CommandText = "insert into Ogrenci(Ad,Soyad) values ('Ali','Bak')";
cmd.ExecuteNonQuery();
}


transaction.Commit();
}
}

Console.WriteLine("****** 1 Milyon Kayıt Eklendi *****");
Console.WriteLine("{0} saniye sürdü", stopwatch.Elapsed.TotalSeconds);

con.Close();

Console.ReadLine();




İşte projedeki tüm kodlar:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

class Program
{

static void Main(string[] args)
{
SQLiteConnection con;
SQLiteCommand cmd;


con = new SQLiteConnection("Data Source=OrnekVt.sqlite;Version=3;");
string sql = @"CREATE TABLE IF NOT EXISTS Ogrenci(
OgrNo INTEGER PRIMARY KEY AUTOINCREMENT ,
Ad TEXT NOT NULL,
Soyad TEXT NOT NULL
);";

con.Open();
cmd = new SQLiteCommand(sql, con);
cmd.ExecuteNonQuery();


/* 1 Milyon kayıt ekleme*/

var stopwatch = new Stopwatch();
stopwatch.Start();
cmd = new SQLiteCommand();


using (cmd = new SQLiteCommand(con))
{
using (var transaction = con.BeginTransaction())
{
for (var i = 0; i < 1000000; i++)
{
cmd.CommandText = "insert into Ogrenci(Ad,Soyad) values ('Ali','Bak')";
cmd.ExecuteNonQuery();
}


transaction.Commit();
}
}

Console.WriteLine("****** 1 Milyon Kayıt Eklendi *****");
Console.WriteLine("{0} saniye sürdü", stopwatch.Elapsed.TotalSeconds);

con.Close();

Console.ReadLine();

}
}
Çıktı:

 
Üst