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

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

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

我的数据库

CREATE TABLE [dic](
  [ID] INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE ON CONFLICT REPLACE,
  [单词] TEXT UNIQUE ON CONFLICT REPLACE,
  [英式音标] TEXT COLLATE NOCASE,
  [美式音标] TEXT COLLATE NOCASE,
  [解释] TEXT);

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

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

所以拼出来的插入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秒钟

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

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

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

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

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

sqlite 60000行 插入到数据库只用不到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万行,什么不做光跑完一遍就得个把小时)。

上一篇:C# StopWatch的使用


下一篇:PWA小记