• (C#版本)提升SQlite数据库效率——开启事务,极速插入数据,3秒100万,32秒1000万条数据


    SQLite插入数据效率最快的方式就是:开启事务  +   insert语句  +  关闭事务(提交)

    利用事务的互斥性,如果在批量的插入操作前显式地开启一次事务,在插入操作结束后,提交事务,那么所有的操作将只执行一次事务,大大地提高IO效率

    开启事务和提交事务时缺省的,如果不显式写出来,将在每次insert语句前开启事务,insert语句后提交,如果执行insert语句1000万次,那么将自动开启并提交1000万次!!!

    可以尝试,去掉下面代码中两行红色代码,速度将显著下降!!!

     1 using System;
     2 using System.IO;
     3 using System.Data.SQLite;
     4 using System.Diagnostics;
     5 using System.Data.Common;
     6 
     7 namespace SqliteTran
     8 {
     9     class Program
    10     {
    11         static void Main(string[] args)
    12         {
    13             DbProviderFactory Dbfactory = SQLiteFactory.Instance;
    14             using (DbConnection dbConn = Dbfactory.CreateConnection())
    15             {
    16                 //连接数据库
    17                 File.Delete("NBA.db4");
    18                 dbConn.ConnectionString = "data source =  NBA.db4";
    19                 dbConn.Open();
    20                 //创建数据表
    21                 string sql = "create table Garnett ([age] INTEGER PRIMARY KEY, [s] TEXT COLLATE NOCASE)";
    22                 DbCommand cmd = dbConn.CreateCommand();
    23                 cmd.Connection = dbConn;
    24                 cmd.CommandText = sql;
    25                 cmd.ExecuteNonQuery();
    26 
    27                 // 添加参数
    28                 cmd.Parameters.Add(cmd.CreateParameter());
    29                 // 开始计时
    30                 Stopwatch watch = new Stopwatch();
    31                 watch.Start();
    32 
    33                 DbTransaction trans = dbConn.BeginTransaction();
    34                 // 连续插入记录
    35                 for (int i = 0; i < 1000000; i++)
    36                 {
    37                     cmd.CommandText = "insert into Garnett ([s]) values (?)";
    38                     cmd.Parameters[0].Value = i.ToString();
    39                     cmd.ExecuteNonQuery();
    40                 }
    41                 trans.Commit(); 
    42                 dbConn.Close();
    43                 // 停止计时
    44                 watch.Stop();
    45                 Console.WriteLine(watch.Elapsed);
    46                 Console.ReadLine();
    47             }
    48         }
    49     }
    50 }

     不开启事务,插入1k行

     

     开启事务,插入100w行

  • 相关阅读:
    读《大道至简》第二章有感
    读大道至简之感
    C#学习笔记二:并行编程基础:在 PLINQ 和 TPL 中的 Lambda 表达式
    C#学习笔记一:委托、匿名函数、Lambda 表达式
    VS2013 最常用 和 不是最常用的快捷键备忘
    EntityFramework初上手
    C#的值类型,引用类型,栈,堆,ref,out
    python批量下载图片
    django部署for新浪SAE
    Linux下安装搜狗拼音输入法
  • 原文地址:https://www.cnblogs.com/zhaoliankun/p/9167219.html
Copyright © 2020-2023  润新知