sqlite 60000行 插入到数据库只用不到2秒
Posted Testudo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqlite 60000行 插入到数据库只用不到2秒相关的知识,希望对你有一定的参考价值。
我的数据库 名字叫dic.db 和程序放在一起
CREATE TABLE [dic]( [ID] INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE ON CONFLICT REPLACE, [单词] TEXT UNIQUE ON CONFLICT REPLACE, [英式音标] TEXT COLLATE NOCASE, [美式音标] TEXT COLLATE NOCASE, [解释] TEXT);
所以拼出来的插入sql字符串应该是这样的
insert or replace into [dic] (单词,英式音标,美式音标,解释) values (\'zooks\',\'[zuːks]\',\'[zuːks]\',\'用作温和誓愿的感叹短语;\');
C#代码
//批量Insert Into private void buttonInsertInto_Click(object sender, EventArgs e) { sw.Reset(); sw.Start(); string ConnectionString = "Data Source = dic.db; Version=3;"; SqliteHelper sqlite = new SqliteHelper(ConnectionString); sqlite.BatchExecuteCmd(richTextBox4.Lines); sw.Stop(); MessageBox.Show("批量插入SQL语句耗时:" + ( sw.ElapsedMilliseconds / 1000f ).ToString("0.0000 sec")); } //纯替换 Stopwatch sw = new Stopwatch(); private void buttonReplace_Click(object sender, EventArgs e) { sw.Start(); //用的是替换 速度是瞬间的 没有判断,先移除所有空行 //瞬间插入6万行 用替换的办法 //zookeeper ['zuːkiːpə(r)] ['zuːkiːpər] n.动物园管理员; //替换成这样 //insert or replace into [dic] (单词,英式音标,美式音标,解释) //values (\'zookeeper\',\'['zuːkiːpə(r)]\',\' ['zuːkiːpər]\',\'n.动物园管理员;\'); string s = richTextBox4.Text; //1/3最左边替换成 insert or replace into [dic] (单词,英式音标,美式音标,解释) values (\' Regex r = new Regex("^", RegexOptions.Multiline); s = r.Replace(s, "insert or replace into [dic] (单词,英式音标,美式音标,解释) values (\'"); //2/3 tab 替换成 \',\' 下面的空格并不是空格而是复制的tab空格 r = new Regex(" ", RegexOptions.Multiline); s = r.Replace(s, "\',\'"); //3/3最右边替换成 \'); r = new Regex("$", RegexOptions.Multiline); s = r.Replace(s, "\');"); richTextBox4.Text = s; sw.Stop(); MessageBox.Show( "替换耗时:" + ( sw.ElapsedMilliseconds / 1000f ).ToString("0.0000 sec")); }
61991行光标替换了就用了7.8秒,如果用for的话 得小时级别的,得要6个小时、得要7个小时?
批量执行SQL命令只用了1.2秒
/// <summary> /// 转换后的SQL格式语句,事物 执行语句语句 这个语句是瞬间完成的即使是1万条也是这样 /// 一句一句转换成SQL语句是相当的慢的 /// INSERT INTO 表2 (Keyword,Trans,Phrase) VALUES (\'undoubtedly\',\'解释\',\'短语\'); /// </summary> /// <param name="sqlArr">每一行都是完整的 INSERT INTO语句,每插入一条</param> /// <returns>返回异常的SQL语句</returns> public string BatchExecuteCmd(string[] sqlArr) { StringBuilder sb = new StringBuilder(); using (SQLiteConnection conn = new SQLiteConnection(ConnectionString)) { SQLiteCommand cmd = new SQLiteCommand(conn); { conn.Open(); using (DbTransaction trans = conn.BeginTransaction()) { for (int i = 0; i < sqlArr.Length; i++) { try { cmd.CommandText = sqlArr[i]; cmd.ExecuteNonQuery(); } catch { //下面是插入失败的内容 sb.Append(sqlArr[i] + "\\n"); //trans.Rollback();//回滚事务 //MessageBox.Show(EX.Message); } } trans.Commit(); //richTextBox2.Text = sb.ToString(); } } } return sb.ToString(); } }
sqlite批量插入速度是相当快的,而转换成sql语句是相当耗时(用for一行一行遍历,然后再把每行分割开来,这个过程相当耗时,因为这里有6万行,什么不做光跑完一遍就得个把小时)。
以上是关于sqlite 60000行 插入到数据库只用不到2秒的主要内容,如果未能解决你的问题,请参考以下文章
使用 PyQt5 将 multipyle 行插入 sqlite 数据库