2013-08-20 102 views
0

因此,在我們公司,我們有一個非常大量的文章。 我們有一個自定義的搜索功能來搜索這些文章,這裏是一段代碼,它生成了需要優化的搜索查詢的一部分。比較快的方式查詢

 dtModif = dalDocType.FetchByAnyIdentifier(False, "+") 
     sb.Append("(SELECT (") 
     For Each row In dtModif.Rows 
      sb.Append("ISNULL((SELECT -SUM(amount) ") 
      sb.Append("FROM Sales." & row("TableName") & "Detail ") 
      sb.Append("WHERE ArticleID = articles.Article.ArticleId ") 
      sb.Append("AND DATEADD(Year,-1,GETDATE()) < Timestamp ") 
      sb.Append("),0) ") 
      sb.Append("+ ") 
     Next 

     dtModif = dalDocType.FetchByAnyIdentifier(False, "-") 
     For Each row In dtModif.Rows 
      sb.Append("ISNULL((SELECT +SUM(amount) ") 
      sb.Append("FROM Sales." & row("TableName") & "Detail ") 
      sb.Append("WHERE ArticleID = articles.Article.ArticleId ") 
      sb.Append("AND DATEADD(Year,-1,GETDATE()) < Timestamp ") 
      sb.Append("),0)") 
      sb.Append("+ ") 
     Next 

     sb = sb.Remove(sb.Length - 2, 2) 

     sb.Append("))") 

我得到的每一篇文章,其中stockmodifier爲正(那麼多售然後返回),我添加的所有文章,其中stockmodifier爲負的負總和。通過這種方式,我可以獲得文章銷售的次數。 (可以是負面的)。

我現在想知道,有沒有更好的方法來構造這個查詢? 因爲這基本上是對多個SELECTS的SELECT,所以會影響大型數據庫的性能。

在此先感謝。

+0

雖然查詢執行的代碼是在VB.NET這真的是一個VB.NET的問題嗎? – Adrian

+0

修改標籤:) –

+3

我們在這裏討論的表格有多少?看起來這是一個經典的屬性拆分案例 - 您有多個具有相同/相似結構的表格,並且附加部分數據已被編碼到表格名稱中,而不是將實際數據放入(可輕鬆查詢)列中。 –

回答

2

建立的第一件事就是瓶頸的來源。因此,請在SSMS和Include the Actual Execution Plan查詢,你會發現這裏...

enter image description here

具體而言,使用這個..

enter image description here

看看這篇文章,Basic Analysis of Execution Plan,這將幫助您識別數據庫問題。

完成此操作後,如果您仍然遇到問題,請使用類似Antz Profiler的工具來分析應用程序。這將識別代碼中的問題,並協助查明大量使用或需要重構的代碼行。

如果您的代碼庫看起來不錯,那麼請查看任何與UI相關的性能問題,您可能有第三方控件或綁定問題,這些問題可能會影響性能。

此外,請考慮環境,您是否在共享服務器上運行?是大量使用的服務器等?

0

我要做的第一件事就是查詢並檢查其執行計劃,以查看性能降低最多的位置。另外,確保你在你做連接的列和where子句中有索引。