2016-04-14 6 views
1

報告する必要がある請求書データを含む第三者データベースがあります。 「請求書」がクレジットメモであるか実際の請求書であるかにかかわらず、数量フィールドと金額フィールドは正の数として格納されます。タイプ "I" =請求書、 "R" =クレジットを含む1つの文字フィールドがあります。SQL Invoice Queryクレジットを負の数値に変換するパフォーマンス

140万レコードに相当するレポートでは、このデータを合計する必要があるため、クレジットが合計から差し引かれ、請求書が合計に加算され、レポートの8つの異なる列に対してこれを行う必要があります(CurrentYear 、前の年など)

私の問題はこれを達成するためのさまざまな方法のパフォーマンスです。

ベストパフォーマンスがそうのような方程式内CASE文を使用しているように見える:私は8つの異なる列にそれをしなければならないので、

Case WHEN ARH.AccountingYear - 2 = @iCurrentYear THEN ARL.ShipQuantity * (CASE WHEN InvoiceType = 'R' THEN -1 ELSE 1 END) ELSE 0 END as PPY_INVOICED_QTY 

しかし、コード読める賢いが、これはスーパー醜いです、パフォーマンスが良いですすべての1.4Mレコードに対して16秒で実行されます。スカラUDFを使用して

は、パフォーマンスを殺す

Case WHEN ARH.AccountingYear - 2 = @iCurrentYear THEN ARL.ShipQuantity * dbo.fn_GetMultiplier(ARH.InvoiceType) ELSE 0 END as PPY_INVOICED_QTY 

は、ほぼ5分かかります。そうすることはできません。私は考えることができる

その他のオプションは次のようになります。ビューの

  1. 複数のレベル、乗数の列を追加し、新しいビューを使用し、その中から選択し、新しいカラム
  2. ビルドを使用して乗算を行いますR、-1とI、1の2つの列と2つのレコードを持ち、InvoiceTypeに基づいて結合するテーブルですが、これは過剰です。

他のアイデアがありませんか、この種のベストプラクティスの提案ですか?私は、第三者のアプリケーションによって確立された、格納されたデータを変更することはできません。

+0

スキーマを変更して、請求書タイプに基づいて計算列を追加できますか?より読みやすくなりますが、パフォーマンスが向上する可能性があります。 – Igor

+0

残念ながら、サポート契約を無効にすることなく、サードパーティのテーブルを変更することは一切許可されていません。 – Earthworm

+0

その場合、1つ以上のビューがおそらく最も良い賭けです。あなたが含まれているかどうかに応じて、[Indexed view](https://msdn.microsoft.com/en-us/library/ms191432(v = sql.110).aspx)を作成することができます。わずかなパフォーマンスの向上。 – Igor

答えて

0

実際にネストされたバージョンを使用して、複数のビューを使用することにしました。可読性は低くてもメンテナンスが容易です。パフォーマンスは、8つの異なるケースのステートメント全体的に20秒弱で実行されます。

洞察に感謝します。

関連する問題