前のエントリでεπιστημηさんから、追試依頼が来たので追試!
追試の内容は
DBの更新が連続するとき、TRANSACTIONで囲まないとえらく遅いんすよオリジナルは。
.NET-port版ではどうだか知りたいっす。
ということなので、さくっとやってみました。実験したコードは以下の通りです。
using System;
using SQLiteSample.TestDataSetTableAdapters;
using System.Data.SQLite;
using System.Diagnostics;
namespace SQLiteSample
{
class Program
{
static void Main(string[] args)
{
using (var conn = new SQLiteConnection("Data Source=Tran.db"))
{
conn.Open();
Console.WriteLine("CREATE TABLE...");
using (var command = conn.CreateCommand())
{
command.CommandText = "CREATE TABLE Person( " +
" ID integer primary key, " +
" Name nvarchar(50), " +
" Age integer)";
var ret = command.ExecuteNonQuery();
Console.WriteLine(ret);
}
Console.WriteLine("INSERT...");
var watch = new Stopwatch();
watch.Start();
//using (var tran = conn.BeginTransaction())
//{
using (var command = conn.CreateCommand())
{
command.CommandText = "INSERT INTO Person(ID, Name, Age) VALUES (@id, @name, @age)";
command.Parameters.Add("id", System.Data.DbType.Int64);
command.Parameters.Add("name", System.Data.DbType.String);
command.Parameters.Add("age", System.Data.DbType.Int64);
for (int i = 0; i < 1000; i++)
{
command.Parameters["id"].Value = i;
command.Parameters["name"].Value = "田中 太郎" + i;
command.Parameters["age"].Value = i % 50;
command.ExecuteNonQuery();
}
}
//tran.Commit();
//}
watch.Stop();
Console.WriteLine(watch.ElapsedMilliseconds);
conn.Close();
}
}
}
}
とりあえず1000件のデータをトランザクション無しで放り込んでみると…。
約1分かかりました。
次にトランザクション有りで。トランザクション無し版のコードでコメントになってるトランザクションの処理をコメントアウトして実行しました。
本当は5回計測して一番上と下の値を抜いて平均出そうとしたけど、圧倒的に違ったので1回目で計測終了。
ということで、オリジナルのSQLiteと同じで、大量のデータをINSERTしたりするときは毎回トランザクションが開始されてしまいものすごい性能が劣化してしまうようです。