Azure应用服务上的SQLite - 插入慢速和超时

问题描述 投票:1回答:1

我们有一个进程需要创建一个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秒。同步模式设置为关闭似乎在我的场景中帮助最大。

sqlite azure azure-web-sites ormlite-servicestack azure-web-app-service
1个回答
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))
 {}

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.