1

より効率的にする必要があるクエリがあります。

効率の下限がどこにあるかを確認するためにセクションに分割しています。現在、ネストされた Select ステートメントがいくつかあります。これらはパフォーマンスの問題ですか?

そのうちの 1 つの例を次に示します。

SELECT AgreementID,
       DueDate,
       UpdatedAmountDue AS AmountDue,
       COALESCE((SELECT SUM(UpdatedAmountDue)
                 FROM RepaymentBreakdown AS B
                 WHERE CONVERT(datetime, CONVERT(varchar, DueDate, 103), 103) <= 
                       CONVERT(datetime, CONVERT(varchar, R.DueDate, 103), 103)
                 AND B.AgreementID = R.AgreementID),0) AS DueTD,
       RN=ROW_NUMBER() OVER (Partition BY R.AgreementID ORDER BY DueDate)
FROM RepaymentBreakdown AS R

DueTD のデータを取得するためのよりクリーンで効率的な方法はありますか?

基本的に、返済スケジュール結果の各行について、取得したいのは次のとおりです。

AgreementID,
DueDate,
AmountDue,
AmountDueToDate (DueTD)
RowNumber.

クエリを実行しているテーブルは次のように構成されています。

AgreementID (int), 
DueDate (datetime),
AmountDue (decimal(9,2)),
UpdatedAmountDue (decimal(9,2))*

UpdatedAmountDueは常に変動数値、AmountDueは常に固定で参考値となります。

4

2 に答える 2

-1

日時から日付への変換には、いくつかの問題があります。

まず、サーバーの言語設定によっては常に正しい結果が得られるとは限りません。日時値に対して文字列操作を行う必要がある場合は、常に CONVERT(,,126) を使用してください。

しかし、より重要なことは、インデックスの使用を防ぐことです。代わりCAST(DueDate AS DATE)に、オプティマイザがその変換がインデックス セーフであると認識するため、使用します。

その後、AgreementId、DueDate にインデックスを追加し、INCLUDEUpdatedAmountDue またはクラスター化することをお勧めします。

UpdatedAmountDue を NULL にすることはできないと仮定すると、合計には常に現在の行が含まれるため、COALESCE も取り除くことができます。

于 2013-07-02T13:45:42.697 に答える