sqlite提交索引的性能问题

时间:2011-06-09 19:06:25

标签: c# windows sqlite

我遇到了提交时间的问题 越来越长。我们正在谈论一张桌子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);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您是否尝试减少硬盘访问,例如在创建任何表之前添加此命令:

cmd.CommandText = "PRAGMA locking_mode = EXCLUSIVE";
cmd.ExecuteNonQuery();

提供您的应用程序允许独占锁定数据库。

也可以提供帮助:

PRAGMA Synchronous=OFF