1
select *
from table1 t1
where
  t1.somedate between UDF(date1) and UDF(date2)

UDF: ユーザー定義関数

これUDF(date1)UDF(date2)は、 の各行ごとに評価されますt1

これにより、パフォーマンスが低下します。

私が試した2番目のオプション

declare @a datetime, @b datetime
set @a=UDF(date1)
set @b=UDF(date2)
select *
    from table1 t1
    where
      t1.somedate between @a and @b

これでも結構時間がかかります。

何が原因で、何が回避策になるのでしょうか。

私が書くなら

select *
    from table1 t1
    where
      t1.somedate between date1 and date2

その非常に高速です。約3秒かかります。上記のクエリには 2 ~ 3 分かかります。

4

1 に答える 1

1

まず第一に、UDF は決定論的であるべきであるため、UDF の代わりに変数を使用してもパフォーマンスは向上しないと思います。したがって、一度だけ計算されます。

第二に、somedate フィールドにインデックスはありますか? そうでない場合は、1つ入れてください。持っている場合は、取得するデータの量と、ネットワークに問題があるかどうかを確認してください。

クエリプランを確認する必要があります。そこで何が起こっているのかがよくわかります。

于 2012-09-27T07:14:12.267 に答える