2016-08-03 119 views
1

我在Windows 7上使用ServerStack.OrmLite 4.0。 我使用OrmLite創建了一個表,並在Sqlite文件中插入了大約100行數據。 Db.Select()的時間花了大約1分鐘。當我將數據庫更改爲mysql時,它立即返回結果。我也嘗試使用另一個GUI軟件訪問sqlite數據庫,並嘗試執行一些sql語句,他們都運行良好。有人有任何線索嗎?用於SQLite的ServiceStack.Ormlite,運行速度非常慢

更新,代碼:

static void Main(string[] args) 
    { 
     string dbName = "testdb.sqlite"; 
     var path = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 
     if (!System.IO.File.Exists(path + "/" + dbName)) 
     { 
      System.IO.File.Create(path + "/" + dbName).Dispose(); 
     } 
     var dbFacory = new OrmLiteConnectionFactory("Data Source=./testdb.sqlite;Version=3;UTF8Encoding=True;", SqliteDialect.Provider); 
     //var dbFacory = new OrmLiteConnectionFactory(":memory:", SqliteDialect.Provider); 
     var db = dbFacory.OpenDbConnection(); 
     db.DropAndCreateTable<TestTable>(); 
     db.DropAndCreateTable<BasicPersonnelInfo>(); 

     Console.WriteLine("Starts at : {0}", DateTime.Now.Second); 
     for (int i = 0; i < 100; i++) 
     { 
      db.Insert<TestTable>(new TestTable { TestField = i.ToString()}); 
      db.Insert<BasicPersonnelInfo>(new BasicPersonnelInfo { Test3 = i.ToString()}); 
     } 
     Console.WriteLine("Inserting Completed;"); 
     Console.WriteLine("Select at : {0}", DateTime.Now.Second); 
     db.Select<BasicPersonnelInfo>(); 
     Console.WriteLine("Ends at : {0}", DateTime.Now.Second); 
     Console.WriteLine("Prese anykey to quit!"); 
     Console.ReadKey(); 
    } 

回答

2

如果保存的SQLite到磁盤,我已經看到了很長的運行由於文件權限的時間,如果你在ASP.NET運行你的SQLite數據庫應保存在您的~/App_Data文件夾中,並且應該給予IIS_USR用戶帳戶的寫入權限。

提供的預期時間,應該採取我添加了一個Simple Insert/Select Benchmark進行的插入和選擇表中的100行含20分字符串列兩個SQLite的內存一些想法:

var dbFactory = new OrmLiteConnectionFactory(":memory:", SqliteDialect.Provider); 
using (var db = dbFactory.Open()) 
{ 
    db.DropAndCreateTable<TableWithStrings>(); 

    var sw = Stopwatch.StartNew(); 
    for (int i = 0; i < 100; i++) 
    { 
     var row = TableWithStrings.Create(i); 
     db.Insert(row); 
    } 
    "[:memory:] Time to INSERT 100 rows: {0}ms".Print(sw.ElapsedMilliseconds); 

    sw = Stopwatch.StartNew(); 
    var rows = db.Select<TableWithStrings>(); 
    "[:memory:] Time to SELECT {0} rows: {1}ms".Print(rows.Count, sw.ElapsedMilliseconds); 
} 

和一個SQLite文件數據庫:

var dbPath = "~/App_Data/db.sqlite".MapProjectPath(); 
var dbFactory = new OrmLiteConnectionFactory(dbPath, SqliteDialect.Provider); 
using (var db = dbFactory.Open()) 
{ 
    db.DropAndCreateTable<TableWithStrings>(); 

    var sw = Stopwatch.StartNew(); 
    for (int i = 0; i < 100; i++) 
    { 
     var row = TableWithStrings.Create(i); 
     db.Insert(row); 
    } 
    "[db.sqlite] Time to INSERT 100 rows: {0}ms".Print(sw.ElapsedMilliseconds); 

    sw = Stopwatch.StartNew(); 
    var rows = db.Select<TableWithStrings>(); 
    "[db.sqlite] Time to SELECT {0} rows: {1}ms".Print(rows.Count, sw.ElapsedMilliseconds); 
} 

運行此作爲我2013年的MacBook Pro工作站上的R·NUnit測試裏面VS.NET 2015(帶4個VS實例和多個RDBMS在後臺運行)結果:

[:memory:] Time to INSERT 100 rows: 10ms 
[:memory:] Time to SELECT 100 rows: 1ms 

和SQLite的文件數據庫:

[db.sqlite] Time to INSERT 100 rows: 659ms 
[db.sqlite] Time to SELECT 100 rows: 13ms 

雖然這不是一個適當的基準(即沒有預熱,不在控制檯應用程序中有更多的迭代),它應該提供預期結果的一些指示。注意OrmLite測試使用OrmLite SQLite的ServiceStack.OrmLite.Sqlite.Mono版本。

+0

我正在將SQLite保存到磁盤。謝謝,我試過在內存中使用SQLite數據庫。它仍然很慢(花費大約相同的時間,就像我從內存中的SQLite數據庫中進行選擇一樣),因此文件權限已被分解。我不知道發生了什麼事。 – gnaix

+0

@ gnaix如果你可以創建一個獨立的問題並將其發佈到github存儲庫,那麼它絕對不應該在1分鐘左右的時間內使用SQLite插入100行,我可以看看。 – mythz

+0

[進程監視器](https://technet.microsoft.com/en-us/sysinternals/processmonitor.aspx)可以幫助您。 – labilbe

相關問題