sqlite 60000行 插入到数据库只用不到2秒

Posted Testudo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqlite 60000行 插入到数据库只用不到2秒相关的知识,希望对你有一定的参考价值。

clipboard

clipboard

我的数据库 名字叫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);

clipboard

clipboard

所以拼出来的插入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行,光粘贴进来都用了2秒钟

clipboard

61991行光标替换了就用了7.8秒,如果用for的话 得小时级别的,得要6个小时、得要7个小时?

clipboard

批量执行SQL命令只用了1.2秒

clipboard

clipboard



  /// <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 数据库

检索在 sqlite 数据库中插入的所有行,并在包含标签的表视图单元格中显示为具有不同部分的子视图

在 sqlite3 中更快的批量插入?

SQLite3代码动态插入要删除的行数据的列值

获取 SQLite 上最后插入行的 ID 的最佳方法

针对 20,000 多次更新优化 Sqlite3