gpt4 book ai didi

c# - 用于 sqlite 的 ServiceStack.Ormlite 运行时间非常慢

转载 作者:行者123 更新时间:2023-12-02 02:46:51 26 4
gpt4 key购买 nike

我在 Windows 7 上使用 ServerStack.OrmLite 4.0。我使用 OrmLite 创建了一个表,并在 Sqlite 文件中插入了大约 100 行数据。Db.Select() 的时间大约需要 1 分钟。当我将数据库更改为mysql时,它立即返回结果。我还尝试使用另一个GUI软件访问sqlite数据库,并尝试执行一些sql语句,它们都工作正常。有人知道吗?

更新代码:

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();
}

最佳答案

如果您将 SQLite 保存到磁盘,由于文件权限,我发现运行时间非常长,如果您在 ASP.NET 中运行,您的 SQLite 数据库应该保存在 ~/App_Data 文件夹,并应授予 IIS_USR 用户帐户的写入权限。

为了提供一些关于预计需要的时间的信息,我添加了 Simple Insert/Select Benchmark在内存中的 SQLite 中插入并选择包含 20 个字符串列的表中的 100 行:

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 工作站(有 4 个 VS 实例和多个 RDBMS 在后台运行)上的 VS.NET 2015 中将其作为 R# NUnit 测试运行,结果如下:

[: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 测试使用 ServiceStack.OrmLite.Sqlite.Mono OrmLite SQLite 版本。

关于c# - 用于 sqlite 的 ServiceStack.Ormlite 运行时间非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38735235/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com