C# sqlite提交索引的性能问题
我遇到了一个问题,执行提交的时间开始占用 越来越长。我们正在讨论一张桌子250毫秒的订单 具有约20k条线,光盘大小约为2-3mb。而且情况越来越糟。我已经追踪到了 性能问题归根结底与索引有关。差不多了 就像sqlite在每次提交时都创建索引一样。提交包括 100个插页。我已经尽可能地做了一个小程序 重现这个问题,并尝试在Linux上运行它。 在那里,问题似乎没有发生。两者都存在问题 WAL和truncate日志记录模式。这个问题似乎不存在 当我使用内存数据库而不是文件时。我两者都试过了 版本3.6.23.1和3.7.6.3 在遇到问题的Windows上,我使用C语言运行sqlite# 程序我已经检查了中事务支持的实现 System.Date.Sqlite包装器,它完全不做其他任何事情 而不仅仅是承诺。遗憾的是,我没有针对Windows的C编译器 所以我不能在不运行包装器时检查它,但它应该是 一样C# sqlite提交索引的性能问题,c#,windows,sqlite,C#,Windows,Sqlite,我遇到了一个问题,执行提交的时间开始占用 越来越长。我们正在讨论一张桌子250毫秒的订单 具有约20k条线,光盘大小约为2-3mb。而且情况越来越糟。我已经追踪到了 性能问题归根结底与索引有关。差不多了 就像sqlite在每次提交时都创建索引一样。提交包括 100个插页。我已经尽可能地做了一个小程序 重现这个问题,并尝试在Linux上运行它。 在那里,问题似乎没有发生。两者都存在问题 WAL和truncate日志记录模式。这个问题似乎不存在 当我使用内存数据库而不是文件时。我两者都试过了 版本3
System.IO.File.Delete(“test.db”);
var db_connection=new SQLiteConnection(@“Data Source=test.db”);
db_connection.Open();
使用(var cmd=db_connection.CreateCommand())
{
cmd.CommandText=“创建表测试(id integer主键,dato integer)”;
cmd.ExecuteNonQuery();
cmd.CommandText=“在测试时创建索引i(dato)”;
cmd.ExecuteNonQuery();
}
SQLiteTransaction=null;
列表路径=新列表();
var random=新的random();
对于(var j=0;j<150;++j)
{
对于(变量i=0;i<1000;++i)
{
如果(i%100==0)
{
trans=db_connection.BeginTransaction();
}
使用(var cmd=db_connection.CreateCommand())
{
cmd.CommandText=String.Format(“插入测试(dato)值({0})”,random.Next(11000000));
cmd.ExecuteNonQuery();
}
如果(i%100==99&&trans!=null)
{
var now=DateTime.now;
trans.Commit();
trans.Dispose();
System.Console.WriteLine(“提交{0}”,(DateTime.Now-Now.total毫秒);
}
}
}
您是否尝试减少硬盘访问,例如在创建任何表之前添加此命令:
cmd.CommandText = "PRAGMA locking_mode = EXCLUSIVE";
cmd.ExecuteNonQuery();
提供您的应用程序允许独占锁定数据库
还可以帮助:
PRAGMA Synchronous=OFF
这个问题似乎与随机数的插入有关。如果我将其更改为插入j*1000+I,则性能良好。但是,当你不能事先对结果进行排序,使它们整齐地吻合时,你该怎么办呢。在添加完所需的元素之前,是否禁用索引?
PRAGMA Synchronous=OFF