2012-03-15 9 views
1

暗黙的な変換を減らすことによって、格納されているprocsの一部を高速化しようとしています。私たちが把握しようとしている問題の一つは、これに似たいくつかのインデックス付きビューを修正する方法である:最適化されていない列の種類を強制的にインデックス化したインデックス付きビュー

Time.UserID is INT
Time.TimeUnit is DECIMAL(9,2)
Time.BillingRate is MONEY

Select 
    UserID, 
    SUM(TimeUnit) as Hours, 
    SUM(TimeUnit*BillingRate) as BillableDollars 
FROM 
    Time 
GROUP BY 
    UserID 

私たちの列を持つビューを提供します:

UserID(int, null) 
Hours(decimal(38,2), null) 
BillableDollars(decimal(38,6), null) 

Hours(decimal(9,2),null)BillableDollars(money,null)を使用することをお勧めします。

は、クラスタ化インデックスを作成できません「ix_indexName」 ビュー「x.dbo.vw_viewName」上のビューの 選択リストは、集計の結果に表現が含まれているので:返さ

CAST(SUM(TimeUnit*BillingRate) AS MONEY) as BillableDollars

機能またはグループ化の列。選択リストから 集計関数または列の結果の式を削除することを検討してください。

そして、私たちはこれらの列の型を維持するための最良の方法であるか、「ベストプラクティス」はありますでしょう何SUM(CAST(TimeUnit*BillingRate AS MONEY)) as BillableDollars

の効率について心配していましたか?

+1

あなたは 'SUM(CAST)'のパフォーマンスを試しましたか? 'MONEY'ともっと実用的なデータ型(' DECIMAL(9,2) ')IMHOを比較しましたか? –

答えて

2

私は、変換を適用してタイムテーブルに導出(顕在)「BillableDollars」の列を追加してみてください:私はお金を使用しましたが、もちろん、変換がどんなデータである可能性があり

CONVERT(MONEY,(TimeUnit*BillingRate)) 

タイプは最も効果的にあなたのニーズを満たしています。

これにより、計算された請求可能なドルを合計しながらインデックス付きのビューを作成できると思います。

ビューのデータ型の精度がテーブルのデータ型の精度よりも高い理由は、精度が9の数値の合計が必要な数値根本的なインデックス付きビューが実際にクエリオプティマイザで利用されているので、精度が

0

9より大きいちょうどあなたがNOEXPANDヒントを含めることができますボーナスとして、この

CREATE VIEW MyView 
AS 
SELECT CAST(UserID AS INT)    AS UserID 
     , CAST(TimeUnit AS DECIMAL(9,2)) AS TimeUnit 
     , CAST(BillingRate AS MONEY)  AS BillingRate 
FROM MyViewIndexed WITH (NOEXPAND) 

のように第二の「キャスト」ビューでインデックス付きビューを包みますMSSQLのあまり「先進的な」エディションです。

関連する問題