Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# sqlite提交索引的性能问题_C#_Windows_Sqlite - Fatal编程技术网

C# sqlite提交索引的性能问题

C# sqlite提交索引的性能问题,c#,windows,sqlite,C#,Windows,Sqlite,我遇到了一个问题,执行提交的时间开始占用 越来越长。我们正在讨论一张桌子250毫秒的订单 具有约20k条线,光盘大小约为2-3mb。而且情况越来越糟。我已经追踪到了 性能问题归根结底与索引有关。差不多了 就像sqlite在每次提交时都创建索引一样。提交包括 100个插页。我已经尽可能地做了一个小程序 重现这个问题,并尝试在Linux上运行它。 在那里,问题似乎没有发生。两者都存在问题 WAL和truncate日志记录模式。这个问题似乎不存在 当我使用内存数据库而不是文件时。我两者都试过了 版本3

我遇到了一个问题,执行提交的时间开始占用 越来越长。我们正在讨论一张桌子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编译器 所以我不能在不运行包装器时检查它,但它应该是 一样

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