我们有一个进程需要创建一个sql lite数据库,其中有几个表有大约750k记录/ 100mb。它会上传到其他位置(Azure存储Blob)。我知道Azure App的磁盘I / O速度非常慢,而且在本地运行它需要几秒钟,它总是在Azure上超时。我已尝试将WEBSITE_LOCAL_CACHE_OPTION
设置为always
并使用临时文件夹,但这没有帮助。
我研究了在内存数据库中使用sql lite,但是如果我想将它转换为在azure应用程序中速度较慢的字节数组(或流),似乎无法避免文件系统。理想情况下,访问内存数据库以流式传输到博客是最好的情况。
在sql lite或azure app服务中是否有任何调整可以在合理的时间内完成?
使用服务堆栈的ormlite。这是一个例子:
using (var trans = dba.OpenTransaction( System.Data.IsolationLevel.ReadUncommitted))
{
dbLite.InsertAll(locs);
foreach (var s in sales)
{
dbLite.Insert<Sales>(s);
}
trans.Commit();
}
有趣的是,我从没有工作的时间下来(10分钟写了5mb,所以我知道它永远不会完成)到4-5分钟
dbLite.ExecuteSql("pragma page_size = 8192");
dbLite.ExecuteSql("pragma synchronous = OFF");
dbLite.ExecuteSql("PRAGMA journal_mode = OFF");
在本地比较1秒。设置为关闭的同步模式在我的场景中似乎有所帮助。
答案 0 :(得分:1)
似乎设置dbLite.ExecuteSql("pragma synchronous = OFF");
最大的好处是将查询从估计的140分钟缩短到4-5分钟。关闭它有一些缺点,但对于我的情况,我们只是归档一些数据,因此它们是最小的。如果有人有其他方法可以进一步延长插入时间,我会接受它们,如果它们会对时间造成重大影响。
对于一个有4个桌子和大约600k行的70mb数据库,我最终得到了1分5秒的时间。
dbLite.ExecuteSql("pragma page_size = 8192");
dbLite.ExecuteSql("pragma synchronous = OFF");
dbLite.ExecuteSql("PRAGMA journal_mode = OFF");
dbLite.ExecuteSql("PRAGMA LOCKING_MODE = OFF");
context.WriteLine("Creating Tables");
和
using (var trans = dba.OpenTransaction(System.Data.IsolationLevel.ReadUncommitted))
{}