加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何提高效率SQLITE 大数据量操作效率

发布时间:2020-12-13 00:16:28 所属栏目:百科 来源:网络整理
导读:今天有个朋友测试 SQLite,然后得出的结论是:SQLite 效率太低,批量插入1000条记录,居然耗时 2 分钟! using System.Data; using System.Data.Common; using System.Data.SQLite; // 创建数据库文件 File.Delete( " test1.db3 " ); SQLiteConnection.Creat

今天有个朋友测试 SQLite,然后得出的结论是:SQLite 效率太低,批量插入1000条记录,居然耗时 2 分钟!

   
   
    
    using
    
     System.Data; 
    
    using
    
     System.Data.Common; 
    
    using
    
     System.Data.SQLite; 
    
    //
    
     创建数据库文件
    
     
    
    File.Delete(
    
    "
    
    test1.db3
    
    "
    
    ); SQLiteConnection.CreateFile(
    
    "
    
    test1.db3
    
    "
    
    ); DbProviderFactory factory 
    
    =
    
     SQLiteFactory.Instance; 
    
    using
    
     (DbConnection conn 
    
    =
    
     factory.CreateConnection()) { 
    
    //
    
     连接数据库
    
     
    
     conn.ConnectionString 
    
    =
    
     
    
    "
    
    Data Source=test1.db3
    
    "
    
    ; conn.Open(); 
    
    //
    
     创建数据表
    
     
    
     
    
    string
    
     sql 
    
    =
    
     
    
    "
    
    create table [test1] ([id] INTEGER PRIMARY KEY,[s] TEXT COLLATE NOCASE)
    
    "
    
    ; DbCommand cmd 
    
    =
    
     conn.CreateCommand(); cmd.Connection 
    
    =
    
     conn; cmd.CommandText 
    
    =
    
     sql; cmd.ExecuteNonQuery(); 
    
    //
    
     添加参数
    
     
    
     cmd.Parameters.Add(cmd.CreateParameter()); 
    
    //
    
     开始计时
    
     
    
     Stopwatch watch 
    
    =
    
     
    
    new
    
     Stopwatch(); watch.Start(); 
    
    //
    
     连续插入1000条记录
    
     
    
     
    
    for
    
     (
    
    int
    
     i 
    
    =
    
     
    
    0
    
    ; i 
    
    <
    
     
    
    1000
    
    ; i
    
    ++
    
    ) { cmd.CommandText 
    
    =
    
     
    
    "
    
    insert into [test1] ([s]) values (?)
    
    "
    
    ; cmd.Parameters[
    
    0
    
    ].Value 
    
    =
    
     i.ToString(); cmd.ExecuteNonQuery(); } 
    
    //
    
     停止计时
    
     
    
     watch.Stop(); Console.WriteLine(watch.Elapsed); }
   
   

哎~~~~ 一个常识性的错误,我加几行代码 (新增代码标记 "// <-------------------")。

   
   
    
    using
    
     System.Data; 
    
    using
    
     System.Data.Common; 
    
    using
    
     System.Data.SQLite; 
    
    //
    
     创建数据库文件
    
     
    
    File.Delete(
    
    "
    
    test1.db3
    
    "
    
    ); SQLiteConnection.CreateFile(
    
    "
    
    test1.db3
    
    "
    
    ); DbProviderFactory factory 
    
    =
    
     SQLiteFactory.Instance; 
    
    using
    
     (DbConnection conn 
    
    =
    
     factory.CreateConnection()) { 
    
    //
    
     连接数据库
    
     
    
     conn.ConnectionString 
    
    =
    
     
    
    "
    
    Data Source=test1.db3
    
    "
    
    ; conn.Open(); 
    
    //
    
     创建数据表
    
     
    
     
    
    string
    
     sql 
    
    =
    
     
    
    "
    
    create table [test1] ([id] INTEGER PRIMARY KEY,[s] TEXT COLLATE NOCASE)
    
    "
    
    ; DbCommand cmd 
    
    =
    
     conn.CreateCommand(); cmd.Connection 
    
    =
    
     conn; cmd.CommandText 
    
    =
    
     sql; cmd.ExecuteNonQuery(); 
    
    //
    
     添加参数
    
     
    
     cmd.Parameters.Add(cmd.CreateParameter()); 
    
    //
    
     开始计时
    
     
    
     Stopwatch watch 
    
    =
    
     
    
    new
    
     Stopwatch(); watch.Start(); DbTransaction trans 
    
    =
    
     conn.BeginTransaction(); 
    
    //
    
     <-------------------
    
     
    
     
    
    try
    
     { 
    
    //
    
     连续插入1000条记录
    
     
    
     
    
    for
    
     (
    
    int
    
     i 
    
    =
    
     
    
    0
    
    ; i 
    
    <
    
     
    
    1000
    
    ; i
    
    ++
    
    ) { cmd.CommandText 
    
    =
    
     
    
    "
    
    insert into [test1] ([s]) values (?)
    
    "
    
    ; cmd.Parameters[
    
    0
    
    ].Value 
    
    =
    
     i.ToString(); cmd.ExecuteNonQuery(); } trans.Commit(); 
    
    //
    
     <-------------------
    
     
    
     } 
    
    catch
    
     { trans.Rollback(); 
    
    //
    
     <-------------------
    
     
    
     
    
    throw
    
    ; 
    
    //
    
     <-------------------
    
     
    
     } 
    
    //
    
     停止计时
    
     
    
     watch.Stop(); Console.WriteLine(watch.Elapsed); }
   
   

执行一下,耗时 0.2 秒。这差距是不是太大了点?

为什么只是简单启用了一个事务会有这么大的差距呢?很简单,SQLite 缺省为每个操作启动一个事务,那么原代码 1000 次插入起码开启了 1000 个事务,"事务开启 + SQL 执行 + 事务关闭" 自然耗费了大量的时间,这也是后面显示启动事务后为什么如此快的原因。其实这是数据库操作的基本常识,大家要紧记,不好的代码效率差的不是一点半点。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读