報告する必要がある請求書データを含む第三者データベースがあります。 「請求書」がクレジットメモであるか実際の請求書であるかにかかわらず、数量フィールドと金額フィールドは正の数として格納されます。タイプ "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分かかります。そうすることはできません。私は考えることができる
その他のオプションは次のようになります。ビューの
- 複数のレベル、乗数の列を追加し、新しいビューを使用し、その中から選択し、新しいカラム
- ビルドを使用して乗算を行いますR、-1とI、1の2つの列と2つのレコードを持ち、InvoiceTypeに基づいて結合するテーブルですが、これは過剰です。
他のアイデアがありませんか、この種のベストプラクティスの提案ですか?私は、第三者のアプリケーションによって確立された、格納されたデータを変更することはできません。
スキーマを変更して、請求書タイプに基づいて計算列を追加できますか?より読みやすくなりますが、パフォーマンスが向上する可能性があります。 – Igor
残念ながら、サポート契約を無効にすることなく、サードパーティのテーブルを変更することは一切許可されていません。 – Earthworm
その場合、1つ以上のビューがおそらく最も良い賭けです。あなたが含まれているかどうかに応じて、[Indexed view](https://msdn.microsoft.com/en-us/library/ms191432(v = sql.110).aspx)を作成することができます。わずかなパフォーマンスの向上。 – Igor