zoukankan      html  css  js  c++  java
  • 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] + "
    ");
                                    //trans.Rollback();//回滚事务
                                    //MessageBox.Show(EX.Message);
                                }
                            }
                            trans.Commit();
                            //richTextBox2.Text = sb.ToString();
                        }
                    }
                }
                return sb.ToString();
            }
    
        }


    sqlite批量插入速度是相当快的,而转换成sql语句是相当耗时(用for一行一行遍历,然后再把每行分割开来,这个过程相当耗时,因为这里有6万行,什么不做光跑完一遍就得个把小时)。

  • 相关阅读:
    浙江大学数据结构:02-线性结构3 Reversing Linked List (25分)
    浙江大学数据结构:02-线性结构2 一元多项式的乘法与加法运算 (20分)
    浙江大学数据结构:01-复杂度2 Maximum Subsequence Sum (25分)
    SQL事务--转载
    触发器--转载
    项目版本控制工具SVN介绍--转载
    项目版本控制工具VSS介绍--转载
    AE开发中ICircularArc接口的图形要素保存与形状简化--原创
    ArcGISEngine绘制椭圆--转载
    NPOI学习--转载
  • 原文地址:https://www.cnblogs.com/xe2011/p/12109842.html
Copyright © 2011-2022 走看看