2015-09-22 117 views
-1

我爲我的公司構建了文檔管理系統。桌面應用程序連接到作爲Azure Web App託管的ASP.Net Web API,該應用程序連接到Azure SQL數據庫。SQL Azure上查詢性能緩慢

由於我的數據庫已經變得越來越多,它開始顯着減慢,所以我需要幫助做這樣的查詢優化。這裏是目前導致我問題的Linq查詢。基本上,這個查詢捕獲所有從數據庫中的項目,然後在我的桌面應用程序填充列表

var projects = (from p in db.Projects.Include(c => c.ProjectType) 

          select new 
          { 
           ID = p.ID, 
           HasSubProjects = (db.Projects.Where(u => u.ParentProjectID == p.ID).Count() > 0) ? 1 : 0, 
           ParentProjectID = p.ParentProjectID, 
           Name = p.Name, 
           Description = p.Description, 
           DateLastEdited = p.DateLastEdited, 
           DateCreated = p.DateCreated, 
           ProjectTypeID = p.ProjectTypeID, 
           LastEditedByGoesby = p.LastEditedByGoesby, 
           ProjectComponentSecurityType = p.ProjectComponentSecurityType, 
           ClonedFrom = p.ClonedFrom, 
           DateAnyVersionLastEditedByUser = p.DateAnyVersionLastEditedByUser, 
           DateAnyVersionLastEdited = p.UserProjectActivityLookups 
            .OrderByDescending(u => u.LastActivityDate) 
            .Select(v => v.LastActivityDate) 
            .FirstOrDefault(), 
           // p.DateAnyVersionLastEdited,, 
           ProjectType = p.ProjectType 

          }).ToList() 
       .Select(x2 => new Project 
       { 
        ID = x2.ID, 
        HasSubProjects = x2.HasSubProjects, 
        ParentProjectID = x2.ParentProjectID, 
        Name = x2.Name, 
        Description = x2.Description, 
        DateLastEdited = x2.DateLastEdited, 
        DateCreated = x2.DateCreated, 
        ProjectTypeID = x2.ProjectTypeID, 
        LastEditedByGoesby = x2.LastEditedByGoesby, 
        ProjectComponentSecurityType = x2.ProjectComponentSecurityType, 
        ClonedFrom = x2.ClonedFrom, 
        DateAnyVersionLastEditedByUser = x2.DateAnyVersionLastEditedByUser, 
        DateAnyVersionLastEdited = x2.DateAnyVersionLastEdited, 
        ProjectType = x2.ProjectType 
       }); 
      ; 

如何優化這一點,避免與此相關的查詢問題,更好地創建索引,或者使用標準程序等是否有任何想法有幫助。我正在尋找這個特定查詢的方向,但也有關於如何提高其他查詢性能的指導以及如何去做。

謝謝。

+3

那麼,通常的想法是問問數據庫的查詢計劃。從那裏可以很容易地發現缺失的索引。 – Joey

+0

你在什麼Azure SQL數據庫服務層/性能級別?這是基本的嗎? – ajg

+0

數據庫包含多少條目?在某個時間點(或者DB填充級別),應用程序無法將全部內容加載到內存中,而不管索引。然後,您需要在應用程序級別更改策略,例如通過分頁或按需加載列表和UI元素。 – Christoph

回答

1

我認爲最好的方法是找出這個代碼生成的sql查詢。然後嘗試查看該sql查詢的問題,並相應地更改您的linq查詢。

一些事情,你應該尋找:

  1. ParentProjectID,檢查索引和嘗試加入,而不是子查詢。
  2. 同樣檢查DateAnyVersionLastEdited,因爲查詢違背了所有用戶數據。如果這有很多數據和錯誤的索引,這可能會降低你的速度。
  3. 最後,我會建議有一個where子句取決於您正在檢索的數據。

所以,如果你最終檢索在數千記錄,然後嘗試或者通過尋呼或一些其他業務條件限制計數。

+0

我認爲問題可能出現在上述#2中,因爲有很多「版本」。我會檢查並報告。謝謝。 – apierceSO

1

Azure SQL數據庫有幾個內置的工具,可以提供查詢優化幫助。

  • Query Store作爲查詢的「飛行數據記錄器」,以獲取查詢計劃,執行時間和查找最昂貴查詢的數據。您可以查看上述查詢的執行統計信息,以查看是否有任何明顯的問題。
  • Index advisor分析歷史資源使用,並提供索引建議並監視索引使用
  • 各種dynamic management views(動態管理視圖)等dm_exec_query_stats提供查詢執行統計信息
  • azure sql database performance guidance
  • MSDN文章提供高電平性能引導信息

Azure SQL數據庫與SQL Server共享公共代碼庫。因此,大多數用於SQL Server的查詢優化技術也適用於此。 Bing/Google搜索SQL Server查詢優化將提供很多指針。

Srini Acharya