1

我們有一個過程需要創建一個包含大約750k記錄/ 100mb的夫婦表的sql lite數據庫。它會上傳到其他地方(Azure存儲Blob)。我知道Azure應用程序的磁盤I/O速度非常慢,並且在本地運行時需要幾秒鐘時間,但Azure總是超時。我已經嘗試將WEBSITE_LOCAL_CACHE_OPTION設置爲always並使用臨時文件夾,但這沒有幫助。Azure應用服務上的SQL Lite - 插入緩慢和超時

我看了一下在內存數據庫中使用sql lite,但似乎沒有辦法避免文件系統,如果我想將其轉換爲在天藍色的應用程序中緩慢的字節數組(或流)。理想情況下訪問內存數據庫以流式傳輸到博客將是最好的情況。

是否有任何調整在SQL精簡版或在蔚藍應用程序服務,這將允許它在一個合理的時間內完成?

使用服務堆棧的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

什麼是應用服務計劃/定價等級爲您蔚藍的網站?你在哪裏執行了關於創建sqlite數據庫的處理過程,並在Web應用程序或webjobs下插入了大約750k條記錄/ 100MB的請求? –

+0

在天藍色上花費多少時間以及詳細的錯誤追蹤是什麼?對於azure應用服務,請求有230秒的超時時間,您可以參考此[問題](https://stackoverflow.com/questions/38673318/azure-asp-net-webapp-the-request-timed-out )。此外,您可以使用'dbLite.InsertAll(sales)'而不是迭代'sales'並插入銷售數據以獲得更好的性能。 –

+0

我試過插入所有/ etc。速度緩慢是由於磁盤IO速度較慢,因爲我可以打開控制檯並查看文件緩慢增加。我結束了使用掛火和後臺線程。同步和日誌設置爲關閉需要4-6分鐘,75mb非壓縮。 – lucuma

回答

1

似乎設置dbLite.ExecuteSql("pragma synchronous = OFF");將查詢從估計的140分鐘減少到4-5分鐘的最大好處。關閉它有一些缺點,但對於我的情況,我們只是歸檔一些數據,因此它們很少。如果任何人有其他方法進一步增加插入時間,我會接受他們,如果他們實質上影響時間。

我最終把我的時間縮短到1分5秒,這是一個70MB的數據庫,有4個表和大約60萬行。

  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