2016-08-03 139 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