亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C# SQLite執行效率的優化教程

2019-10-29 19:59:02
字體:
來源:轉載
供稿:網友

關于SQLite

SQLite是一款輕型的嵌入式的遵守ACID的關系型數據庫管理系統,誕生已有15個年頭了。隨著移動互聯的發展,現在得到了更廣泛的使用。

在使用SQLite之前,我們勢必要先了解它一些“個性”的地方。下面是它的一些特點:

1、 自包含。SQLite很大層度上是獨立的,他只需要非常小的外部庫支持。任何程序能夠訪問磁盤就可以使用SQLite數據庫。這使它適用于嵌入式設備,缺乏桌面計算機支持的基礎設施。這也使得SQLite適用于不作任何修改就可運行在不同配置電腦上的程序。

2、 無服務器。大多數SQL數據庫引擎被實現為一個單獨的服務器進程。程序要訪問數據庫與服務器通信使用某種形式的進程間通信(通常是TCP / IP),向服務器發送請求并接收返回結果。SQLite則不是這種工作方式。對于SQLite,想要訪問數據庫直接從磁盤上的對數據庫文件執行讀和寫操作。沒有中間的服務器進程。

3、 零配置。使用SQLite不需要“安裝”。沒有“設置”程序。沒有服務器進程需要啟動,停止,或配置。不需要管理員來創建一個新的數據庫實例或訪問權限分配給用戶。SQLite不使用配置文件。

4、 支持事務。事務數據庫的所有更改和查詢表現出原子性、一致性、隔離性、持久性(ACID)。執行SQLite的事務操作時,要么完全執行,要么不執行,即使寫入磁盤的操作被程序崩潰,斷電等故障打斷。

5、 開源。和前面的特點相比,這個似乎沒有多大關系。之所以把它作為一個特點,是因為開源在很大層度上會成為我們選擇一個解決方案的重要維度。

本文主要介紹的是關于C# SQLite執行效率優化的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧

一、如要使用SQLite,可以從Visual Studio中的“程序包管理器控制臺”輸入以下命令完成安裝:

PM> Install-Package System.Data.SQLite.Core

SQLite則會安裝到項目中,支持32位或64位,如下圖所示:

C#,SQLite,執行效率

C#,SQLite,執行效率

二、新建一個SQLite數據庫,名稱命名為Test.db,其表名稱及列定義如下:

C#,SQLite,執行效率

三、新建一個控制臺應用的解決方案,并輸入以下代碼,看看SQLite的執行時間:

using System;using System.Collections.Generic;using System.Data;using System.Data.SQLite;using System.Diagnostics;namespace ConsoleApp{ class Program { static void Main(string[] args) {  SQLiteConnection connection = Run(() => new SQLiteConnection("Data Source = Test.db"), "連接對象初始化");  Run(() => connection.Open(), "打開連接");  SQLiteCommand command = Run(() => new SQLiteCommand(connection), "命令對象初始化");  Run(() =>  {  command.CommandText = $"DELETE FROM Info;VACUUM;UPDATE sqlite_sequence SET seq ='0' where name ='Info';";  command.ExecuteNonQuery();  }, "執行DELETE命令及收縮數據庫");  Run(() =>  {  for (int i = 0; i < 3000; i++)  {   command.CommandText = $"INSERT INTO Info(Name, Age) VALUES ('A{i:000}','{i}')";   command.ExecuteNonQuery();  }  command.ExecuteScalar();  }, "[---使用事務---]事務執行INSERT命令");  List<Test> list1 = Run(() =>  {  command.CommandText = $"SELECT * FROM Info";  List<Test> tests = new List<Test>();  SQLiteDataReader reader = command.ExecuteReader();  while (reader.Read())  {   Test t = new Test   {   ID = (long)reader[0],   Name = (string)reader[1],   Age = (long)reader[2]   };   tests.Add(t);  }  reader.Close();  return tests;  }, "[---不使用事務---]使用ExecuteReader方式執行SELECT命令");  DataTable table1 = Run(() =>  {  command.CommandText = $"SELECT * FROM Info";  SQLiteDataAdapter adapter = new SQLiteDataAdapter(command);  DataTable _table = new DataTable();  adapter.Fill(_table);  return _table;  }, "[---不使用事務---]使用Fill Table方式執行SELECT命令");  Run(() =>  {  command.CommandText = $"DELETE FROM Info;VACUUM;UPDATE sqlite_sequence SET seq ='0' where name ='Info';";  command.ExecuteNonQuery();  }, "執行DELETE命令及收縮數據庫");  SQLiteTransaction transaction = Run(() => connection.BeginTransaction(), "開始事務");  Run(() =>   {  for (int i = 0; i < 3000; i++)  {   command.CommandText = $"INSERT INTO Info(Name, Age) VALUES ('A{i:000}','{i}')";   command.ExecuteNonQuery();  }  var result = command.ExecuteScalar();  }, "[---使用事務---]執行INSERT命令");  List<Test> list2 = Run(() =>  {  command.CommandText = $"SELECT * FROM Info";  List<Test> tests = new List<Test>();  SQLiteDataReader reader = command.ExecuteReader();  while (reader.Read())  {   Test t = new Test   {   ID = (long)reader[0],   Name = (string)reader[1],   Age = (long)reader[2]   };   tests.Add(t);  }  reader.Close();  return tests;  }, "[---使用事務---]使用ExecuteReader方式執行SELECT命令");  DataTable table2 = Run(() =>  {  command.CommandText = $"SELECT * FROM Info";  SQLiteDataAdapter adapter = new SQLiteDataAdapter(command);  DataTable _table = new DataTable();  adapter.Fill(_table);  return _table;  }, "[---使用事務---]使用Fill Table方式執行SELECT命令");  Run(() => transaction.Commit(), "提交事務");  Run(() => connection.Close(), "關閉連接");  Console.ReadKey(); } public static void Run(Action action,string description) {  Stopwatch sw = Stopwatch.StartNew();  action();  Console.WriteLine($"--> {description}: {sw.ElapsedMilliseconds}ms"); } public static T Run<T>(Func<T> func, string description) {  Stopwatch sw = Stopwatch.StartNew();  T result = func();  Console.WriteLine($"--> {description}: {sw.ElapsedMilliseconds}ms");  return result; } } class Test { public long ID { set; get; } public string Name { set; get; } public long Age { set; get; } }}

程序運行結果如下:

C#,SQLite,執行效率

四、根據以上的程序運行結果,可以得出以下結論:

1)SQLiteConnection對象初始化、打開及關閉,其花費時間約為109ms,因此,最好不要頻繁地將該對象初始化、打開與關閉,這與SQL Server不一樣,在這里建議使用單例模式來初始化SQLiteConnection對象;

在網上查找了SQLiteHelper幫助類,但很多都是沒執行一次SQL語句,都是使用這樣的流程:初始化連接對象->打開連接對象->執行命令->關閉連接對象,如下的代碼所示:

public int ExecuteNonQuery(string sql, params SQLiteParameter[] parameters)  {   int affectedRows = 0;   using (SQLiteConnection connection = new SQLiteConnection(connectionString))   {   using (SQLiteCommand command = new SQLiteCommand(connection))   {    try    {    connection.Open();    command.CommandText = sql;    if (parameters.Length != 0)    {     command.Parameters.AddRange(parameters);    }    affectedRows = command.ExecuteNonQuery();    }    catch (Exception) { throw; }   }   }   return affectedRows;  }

根據以上的結論,如果要求執行時間比較快的話,這樣的編寫代碼方式實在行不通。

2)使用ExecuteReader方式比使用Adapter Fill Table方式快一點點,但這不是絕對的,這取決于編寫的代碼;

3)無論是執行插入或查詢操作,使用事務比不使用事務快,尤其是在批量插入操作時,減少得時間非常明顯;

比如在不使用事務的情況下插入3000條記錄,執行所花費的時間為17.252s,而使用事務,執行時間只用了0.057s,效果非常明顯,而SQL Server不存在這樣的問題。

4)不能每次執行一條SQL語句前開始事務并在SQL語句執行之后提交事務,這樣的執行效率同樣是很慢,最好的情況下,是在開始事務后批量執行SQL語句,再提交事務,這樣的效率是最高的。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩欧美a级成人黄色| 日韩免费观看在线观看| 国产在线观看一区二区三区| 日韩在线观看免费| 美女精品久久久| 成人在线中文字幕| 69精品小视频| 国产精品人人做人人爽| 欧美一级片免费在线| 亚洲第一页在线| 日韩高清av一区二区三区| 精品国内自产拍在线观看| 欧美美女15p| 国产在线拍偷自揄拍精品| 国产视频福利一区| 国产精品三级久久久久久电影| 午夜精品久久久久久久久久久久久| 视频一区视频二区国产精品| 91九色国产视频| 亚洲最大福利视频| 在线观看中文字幕亚洲| 亚洲人成电影在线播放| 亚洲精品久久7777777| 欧美激情视频播放| 国产精品男女猛烈高潮激情| 色综合色综合久久综合频道88| 欧美黑人xxxⅹ高潮交| 国产精品久久久久久久久男| 亚洲成av人片在线观看香蕉| 国产一区二区三区欧美| 欧美日韩综合视频网址| 91免费在线视频网站| 日韩欧美在线视频观看| 亚洲男人天堂2024| 亚洲第一福利网站| 欧美老女人bb| 亚洲成色777777在线观看影院| 成人精品aaaa网站| 2018日韩中文字幕| 亚洲第一中文字幕在线观看| 国产成人精品999| 欧美丰满老妇厨房牲生活| 欧美最猛性xxxxx亚洲精品| 91福利视频网| 久久人91精品久久久久久不卡| 久久久久久久久综合| 久久久久久国产精品三级玉女聊斋| 国产一区二区三区日韩欧美| 日韩专区中文字幕| 国产精品电影久久久久电影网| 欧美又大粗又爽又黄大片视频| 久久亚洲一区二区三区四区五区高| 97超级碰碰碰| 日韩在线免费视频| 亚洲欧美在线看| 精品一区二区三区三区| 国内自拍欧美激情| 国产成人高潮免费观看精品| 欧美成人午夜激情在线| 国产成人黄色av| 91精品国产综合久久久久久久久| 97久久国产精品| 国产丝袜视频一区| 欧美性高潮床叫视频| 欧美激情一区二区三区成人| 国产精品久久77777| 亚洲精品视频网上网址在线观看| 精品国内产的精品视频在线观看| 国产精品影院在线观看| yw.139尤物在线精品视频| 亚洲色图第三页| 久久精品国产综合| 全球成人中文在线| 成人www视频在线观看| 成人午夜在线影院| 国产一区二区三区精品久久久| 久久99精品久久久久久琪琪| 麻豆国产va免费精品高清在线| 成人在线一区二区| 一本色道久久综合狠狠躁篇怎么玩| 久久久久中文字幕2018| 亚洲一区二区三区在线视频| 日本a级片电影一区二区| 日韩欧美国产视频| 国产视频亚洲视频| 国产欧美精品在线播放| 亚洲国语精品自产拍在线观看| 国产一区二区三区在线免费观看| 欧美高清videos高潮hd| 久久久久久久久久国产精品| 美女视频黄免费的亚洲男人天堂| 亚洲国产高清自拍| 亚洲天堂网站在线观看视频| 色诱女教师一区二区三区| 国产在线a不卡| 日韩av在线资源| 在线亚洲午夜片av大片| yellow中文字幕久久| 欧美三级欧美成人高清www| 97成人精品视频在线观看| xxx欧美精品| 国产极品jizzhd欧美| 国产亚洲激情视频在线| 欧美二区乱c黑人| 亚洲国产精品视频在线观看| 国产精品日韩在线| 久久影院资源网| 色樱桃影院亚洲精品影院| 久久久人成影片一区二区三区| 欧美激情伊人电影| 亚洲在线免费观看| 亚洲美女又黄又爽在线观看| 国产精品自拍偷拍| 亚洲人午夜精品免费| 国内揄拍国内精品| 成人精品久久av网站| 精品偷拍一区二区三区在线看| 亚洲精品综合精品自拍| 精品国产一区二区三区久久久| 久久久91精品国产| www.日韩不卡电影av| 日韩中文字幕免费| 狠狠躁夜夜躁人人躁婷婷91| 欧美日韩亚洲91| 日韩av在线免费播放| 日韩av免费网站| 日韩在线免费av| 亚洲成人激情图| 欧美性猛交xxxx偷拍洗澡| 国内伊人久久久久久网站视频| 欧美精品videossex性护士| 国产精品日韩久久久久| 色综合老司机第九色激情| 亚洲人成绝费网站色www| 秋霞午夜一区二区| 精品一区二区三区四区| 91精品国产综合久久久久久蜜臀| 亚洲一区中文字幕在线观看| 成人午夜两性视频| 91精品国产高清久久久久久91| 这里只有精品在线播放| 亚洲欧美日韩中文在线| 国产精品日韩在线播放| 欧美一区二三区| 日韩在线观看av| 91精品国产综合久久香蕉的用户体验| 欧美视频在线观看免费| 国产美女久久精品| 日韩欧美亚洲综合| 欧洲午夜精品久久久| 亚洲天堂成人在线视频| 久久亚洲一区二区三区四区五区高| 国产伊人精品在线| 精品久久久久久中文字幕| 欧美性猛交xxx| 日韩成人激情视频| 久久亚洲精品视频| 综合网日日天干夜夜久久| 国产精品久久91| 久久人人爽人人爽人人片av高清| 久久久久久久电影一区| 欧美国产日韩中文字幕在线| 亚洲精品一区中文| 国产欧美精品xxxx另类|