0

基本的に、一時テーブルがあり、私の場合は最速のものを見つけるために、さまざまな手法を使用して同じデータをテーブルに入力しています。3 つの方法は次のとおりです。

  1. 結合を使用して挿入された情報を選択する
  2. ほとんどのテーブル/ロジック/計算がインライン関数に含まれている挿入された情報を選択します
  3. ほとんどのテーブル/ロジック/計算がテーブル値関数に含まれている挿入された情報を選択します

各方法でテーブルに同じデータが入力され、テーブル値関数を使用して最高のパフォーマンスが得られます。しかし、ここで事態は奇妙になります。

一時テーブルが作成された後、すべての列で GROUP BY と ORDER BY を使用して単純な SELECT が実行されます。データが同じであるため、同じ実行計画を期待していましたが、次のようになります。

ここに画像の説明を入力

最初の行はテーブル値関数の実行計画で、2 番目の行は最初と 2 番目のメソッドの実行計画です。

同じデータを持つテーブルに対して 2 つの異なる実行プランがあるのはなぜですか? 2 番目のものよりも高速であるため、最初のものを常に使用するとは限らないのはなぜですか?

これはデータの並べ替えとグループ化に関連しているため、テーブル値関数を使用すると日付が既に並べ替えられている可能性があると思いましたが、結果を単純に選択すると、データがそれぞれ同じ方法で並べ替えられていることがわかります場合。

4

1 に答える 1

0

実行計画にはデータよりも多くのものがあります

データベースでのみ見てくださいコードの数行を変更することで1000%以上の改善を得ることができます

このようなものはそうではなくSARGAble 、次善の計画が作成されます

where year(payment_dt) = year(getDate())
and month(payment_dt) = month(getDate())

オプティマイザーは、次の最適な計画を作成します

where payment_dt >= dateadd(mm, datediff(mm, 0, getdate())+0, 0)
and payment_dt < dateadd(mm, datediff(mm, 0, getdate())+1, 0)

これらの2つは同じ行を返し、1つはシークを使用し、もう1つは列の周囲で関数が使用されるため、スキャンを使用します。

于 2012-11-21T16:34:53.560 に答える