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

时间:2017-10-11 00:50:55

标签: sqlite azure azure-web-sites ormlite-servicestack azure-web-app-service

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

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))
 {}

enter image description here