0

So in our company we have a very large amount of articles. We have a customized search function to search in these articles, and here is a piece of code that generates the a part of the searchquery that needs optimalization.

        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(") )")

I get every article where the stockmodifier is positive (so more sold then returned), and I add the negative sum of all articles where the stockmodifier is negative. In that way I can get the number times that article is sold. (Can be negative).

I want to know now, is there a better way to structure this query? Because this is basically a SELECT over multiple SELECTS, so affects performance in large databases.

Thanks in advance.

4

2 に答える 2

2

最初に確立することは、ボトルネックがどこから来ているかです。したがって、SSMS でクエリを実行し、Include the Actual Execution Planここで見つけることができます...

ここに画像の説明を入力

具体的には、これを使用して..

ここに画像の説明を入力.

DB の問題を特定するのに役立つ、この記事「実行計画の基本分析」をご覧ください。

これが完了しても問題が解決しない場合は、Antz Profilerなどのツールを使用してアプリケーションをプロファイリングします。これにより、コード内の問題が特定され、頻繁に使用されているかリファクタリングが必要なコード行を特定するのに役立ちます。

コード ベースに問題がないように見える場合は、UI 関連のパフォーマンスの問題を調べてください。サード パーティ製のコントロールがあるか、パフォーマンスを妨げているバインディングの問題がある可能性があります。

また、環境を考慮してください。共有サーバーで実行していますか? サーバーは頻繁に使用されていますか?

于 2013-08-20T11:52:56.287 に答える
0

私が最初に行うことは、クエリを取得し、その実行計画をチェックして、パフォーマンスが最も低下する場所を確認することです。また、結合と where 句を実行する列にインデックスがあることを確認してください。

于 2013-08-20T11:39:54.933 に答える