背景:SQL Serverの計算列は、単純なselect文のパフォーマンスを減速さ
は以前、私の会社は、ストアドプロシージャのwhere句でエンコードにいくつかのデータをHTMLにユーザー定義関数を使用していました。以下の例:
DECLARE @LName --HTML encoded last name as input parameter from user
SELECT *
FROM (SELECT LName
FROM SomeView xtra
WHERE ((@LName <> ''
AND dbo.EncodingFunction(dbo.DecodingFunction(xtra.LName)) = @LName)
OR @Lname=''))
私は、明確にするために、これを簡素化。
この問合せを含むストアド・プロシージャが45回連続して呼び出されたとき、62,000レコードの表の平均パフォーマンスは約85秒でした。私がUDFを削除したとき、性能はsprocを45回実行するためにわずか1秒以上に改善されました。
そこで、ビューによってアクセスされるテーブルの計算列を含むソリューションについて相談し、決定しました。SomeView
計算列は、このようなテーブル定義の中に書かれていた:
[LNameComputedColumn] AS (dbo.EncodingFunction(dbo.DecodingFunction([LName])))
私は、テーブルを更新し、すべての62,000レコードの計算列ことを自動的にプロセスを実行しました。その後、私は次のようにストアドプロシージャのクエリを変更:私はそのストアドプロシージャを実行したとき
DECLARE @LName --HTML encoded last name as input parameter from user
SELECT * FROM
(SELECT LNameComputedColumn
FROM SomeView xtra
WHERE ((@LName <> '' AND [email protected]) OR @Lname='')
、45人の処刑の平均実行時間は約90秒に増加しました。私の変更は実際に問題を悪化させました!
私は間違っていますか?パフォーマンスを向上させる方法はありますか?
注意点として、私たちは現在、SQL Server 2000を使用していて、非常にすぐに2008 R2へのアップグレードを計画しているが、コードは、SQL Server 2000
を 'OR'のポイントは何ですか? 'OR @LName = '''はテーブルから何も取得していないからです。あまり抽象化することは、みんなの時間を無駄にするだけです。私たちは、わからないことを説明できません。 –