2017-12-28 32 views
0

列が含まれているかどうかにかかわらずクエリのパフォーマンスに影響がありますが、列が含まれている場合は肯定的な影響(時間の短縮)が影響します。列を含めるとクエリのパフォーマンスが向上するSQL Server 2008

クエリは、ビューにいくつかのテーブルを結合して、次のような値関数を提出数が含まれています

SELECT 
    v1.field1, t2.field2 
FROM 
    view v1 WITH (nolock) 
INNER JOIN 
    table t1 WITH (nolock) ON v.field1 = t1.field1 
INNER JOIN 
    table2 t2 WITH (nolock) ON t2.field2 = t1.field2 
INNER JOIN 
    function1(@param) f1 ON f1.field3 = t2.field3 
WHERE 
    (v.date1 = @param OR v.date2 = @param) 

私はselect内のビューの一部(あるvarchar(200) not null列が含まれている場合のものです元の表やビューでは索引付けされておらず、制約の一部ではありません)、問合せのパフォーマンスはX秒ですが、それを含めなければ、パフォーマンスは4倍にアップします。単に列を含めるためです。それはしかし、否定的な方法で実際のパフォーマンスに影響を与えずに、クエリのパフォーマンスを向上させ、カラムを削除するには必須です

SELECT 
    v1.field1, t2.field2, v1.fieldWhichAffectsPerformance 
    view v1 WITH (nolock) 
INNER JOIN 
    table t1 WITH (nolock) ON v.field1 = t1.field1 
INNER JOIN 
    table2 t2 WITH (nolock) ON t2.field2 = t1.field2 
INNER JOIN 
    function1(@param) f1 ON f1.field3 = t2.field3 
WHERE 
    (v.date1 = @param OR v.date2 = @param) 

:そう最高の性能を持つクエリは次のようになります。何か案は?

EDIT:私は実行計画を見直しましたが、列のないクエリは余分なハッシュマッチ(左外部結合)を実行し、インデックススキャンを使用します。列が含まれたクエリ。パフォーマンスに影響を与えずに列を削除するにはどうすればよいですか?何か案は?

+2

selectの列を使用して実行計画を転記します。統計情報が最新のものであることを確認してください。 –

+0

[NOLOCKをどこにでもぶつけるための悪い習慣](http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/) - それは推奨されません*どこでもこれを使用する - 全く反対! –

+0

ソートが使用されていません – oswaldomm2

答えて

0

オプティマイザは複雑です。クエリプランがなければ、推測しかありません。 本当の答えを得るには、クエリプランを調べる必要があります。

処理の順番は1つの可能性があります。 on条件2つのテーブルの列が同じであることを指定するため

SELECT t1.field1, t2.field2 

selectは同等のように書くことができます。オプティマイザは、orがビューのインデックスの使用を妨げることを認識しています(これはおそらく適用されません)。したがって、ビューをスキャンする代わりに、table1をスキャンしてビューを表示することにします。

selectに追加の列を追加すると、ビューをスキャンするためにオプティマイザがプッシュされます。これがより良い実行計画になる可能性があります。

これはすべて仮説ですが、観察されたタイミングがどのように起こるかについてのメカニズムを示しています。

関連する問題