1

Sql サーバー 2005 から 2008 r2 に最近 Sql サーバーをアップグレードした後、奇妙な動作が見られます。アップグレード前は、以下のクエリは 1 秒未満で実行されていましたが、アップグレード後は 10 秒かかります。両方のテーブルに数百万の行があります。

モデル テーブル の null 許容列 colB にインデックスがあります。Join 句で使用されているスカラー関数 isnull があるため、以下のクエリは明らかにインデックス スキャンを実行しています。

 select distinct a.colA
             from ptransaction a
             inner join model b on ISNULL(b.colB,0) = a.colB
             where a.transid = 234

アップグレード前の計画情報はありませんが、このクエリは 1 秒以上実行されませんでした..Sql サーバー 2008 でオプティマイザの動作が変更され、実行速度が低下したかどうかはわかりません。

私は別の解決策を知っていますが、急いでスキーマを変更したくありません.モデルの colB を notnull として変換して、これを修正できることを知っています。他の解決策は、この問題を解決するインデックス付きの計算列を作成することです。私たちの環境でのスキーマの変更は簡単ではないので、Sql の第一人者がスキーマの変更を必要としないアイデアやその他の解決策を持っているかどうかを調べたいと思います。オプティマイザーまたは全体的な SQL サーバーのアップグレードがこのクエリを悪化させる可能性があることをまだ理解できません。どんな助けでも感謝します。

ニュージャージー州

4

1 に答える 1

0

私の経験では、多くのレコードがある場合、ISNULL はクエリを遅くします。

このコードを試してみてください。結果は同じですが、最高のパフォーマンスが得られる傾向があります。

(b.colB is not null and b.colB = a.colB ) OR (b.colB is null and a.colB = 0)
于 2012-09-18T07:27:56.290 に答える