提高 SQLite 性能
Posted
技术标签:
【中文标题】提高 SQLite 性能【英文标题】:Improving SQLite Performance 【发布时间】:2013-02-12 15:28:19 【问题描述】:我有一个file.sql
,其中包含20,000
的插入命令
来自.sql
文件的示例
插入
table
值 (1,-400,400,3,154850,'Text',590628,'TEXT',1610,'TEXT',79);插入
table
值 (39,-362,400,3,111659,'Text',74896,'TEXT',0,'TEXT',14);
我正在使用以下代码创建内存中的 Sqlite 数据库并将值拉入其中然后计算经过的时间
using (var conn = new SQLiteConnection(@"Data Source=:memory:"))
conn.Open();
var stopwatch = new Stopwatch();
stopwatch.Start();
using (var cmd = new SQLiteCommand(conn))
using (var transaction = conn.BeginTransaction())
cmd.CommandText = File.ReadAllText(@"file.sql");
cmd.ExecuteNonQuery();
transaction.Commit();
var timeelapsed = stopwatch.Elapsed.TotalSeconds <= 60
? stopwatch.Elapsed.TotalSeconds + " seconds"
: Math.Round(stopwatch.Elapsed.TotalSeconds/60) + " minutes";
MessageBox.Show(string.Format("Time elapsed 0", timeelapsed));
conn.Close();
我尝试过的事情
-
使用文件数据库而不是内存数据库。
使用开始事务和提交事务 [AS SHOWN IN MY CODE]。
使用Firefox的扩展名为
SQLite Manager
来测试是否
减速问题来自脚本;然而,我很惊讶
我尝试使用我的代码处理的相同 20,000
行
已在 4 毫秒内被拉入数据库!!!。
使用PRAGMA synchronous = OFF
,以及PRAGMA journal_mode =
MEMORY
。
将begin transaction;
和commit transaction;
附加到
.sql
文件的开头和结尾。
正如 SQLite 文档所说:SQLite 能够每秒处理 50,000
命令。这是真实的,我使用SQLite Manager
[如我尝试的第三件事中所述] 确定了这一点;但是,我在 4 分钟内完成了我的 20,000
命令,这表明有问题。
问题:我面临什么问题,为什么执行速度非常慢?!
【问题讨论】:
您是否尝试过在事务对象之后创建命令对象? 我认为这是我的代码中所做的?? 您是否尝试了解 ReadAllText 方法需要多长时间? 只需要一秒钟,因为当我尝试调试程序时它只会停止不到一秒钟 在您的代码中,您先调用new SQLiteCommand(conn)
,然后再调用conn.BeginTransaction()
。尝试在这两行之间切换,看看会发生什么。
【参考方案1】:
SQLite.Net 文档推荐以下交易结构
using (SqliteConnection conn = new SqliteConnection(@"Data Source=:memory:"))
conn.Open();
using(SqliteTransaction trans = conn.BeginTransaction())
using (SqliteCommand cmd = new SQLiteCommand(conn))
cmd.CommandText = File.ReadAllText(@"file.sql");
cmd.ExecuteNonQuery();
trans.Commit();
con.Close();
【讨论】:
【参考方案2】:您是否能够将文本文件上下文操作为:
INSERT INTO table (col01, col02, col03, col04, col05, col06, col07, col08, col09, col10, col11)
SELECT 1,-400,400,3,154850,'Text',590628,'TEXT',1610,'TEXT',79
UNION ALL
SELECT 39,-362,400,3,111659,'Text',74896,'TEXT',0,'TEXT',14
;
也许尝试将它们“分批”成 100 个一组作为初始测试。
http://sqlite.org/lang_select.html
SqlLite 似乎支持 UNION ALL 语句。
【讨论】:
col01 等,我当然会输入真实的列名。这些只是我的占位符。以上是关于提高 SQLite 性能的主要内容,如果未能解决你的问题,请参考以下文章
如何提高 Python 3.6 中的 SQLite 插入性能?