我遇到了提交时间的问题 越来越长。我们正在谈论一张桌子250毫秒的订单 约20k行,光盘大小约2-3mb。而且它一直在恶化。我跟踪了 性能问题与索引有关。这几乎是 好像sqlite正在每次提交时创建索引。提交包括 100个插入物。我尽我所能做了一个小程序 重现问题,并尝试在Linux上运行它。 那里似乎没有问题。两者都存在问题 WAL和截断日记模式。问题似乎不存在 当我使用内存数据库而不是文件。我试过了两个 版本3.6.23.1和3.7.6.3。
在我遇到问题的Windows上我在C#中运行sqlite 程序。我已经检查了事务支持的实现 System.Date.Sqlite包装器,它绝对没有其他功能 而不仅仅是一个COMMIT。可悲的是,我没有Windows的C编译器 所以我不能在不运行包装器时检查它,但它应该是 相同。
System.IO.File.Delete("test.db");
var db_connection = new SQLiteConnection(@"Data Source=test.db");
db_connection.Open();
using (var cmd = db_connection.CreateCommand())
{
cmd.CommandText = "CREATE TABLE test (id integer primary key, dato integer)";
cmd.ExecuteNonQuery();
cmd.CommandText = "CREATE INDEX i on test(dato)";
cmd.ExecuteNonQuery();
}
SQLiteTransaction trans = null;
List<string> paths = new List<string>();
var random = new Random();
for (var j = 0; j < 150; ++j)
{
for (var i = 0; i < 1000; ++i)
{
if (i % 100 == 0)
{
trans = db_connection.BeginTransaction();
}
using (var cmd = db_connection.CreateCommand())
{
cmd.CommandText = String.Format("INSERT INTO test (dato) values ({0})", random.Next(1, 100000000));
cmd.ExecuteNonQuery();
}
if (i % 100 == 99 && trans != null)
{
var now = DateTime.Now;
trans.Commit();
trans.Dispose();
System.Console.WriteLine("commit {0}", (DateTime.Now - now).TotalMilliseconds);
}
}
}
答案 0 :(得分:0)
您是否尝试减少硬盘访问,例如在创建任何表之前添加此命令:
cmd.CommandText = "PRAGMA locking_mode = EXCLUSIVE";
cmd.ExecuteNonQuery();
提供您的应用程序允许独占锁定数据库。
也可以提供帮助:
PRAGMA Synchronous=OFF