0

次の SQL ステートメントのパフォーマンスの問題を調査しています。

Update tableA 
set columnA1 = columnB1 
from tableB 
where tableA.columnA2 = tableB.columnB2

問題は、それtableA.columnA2がタイプnvarchar(50)でありながら、tableB.columnB2タイプであるということですbigint。私の質問は、SQLサーバーがそのようなクエリをどのように実行するかです。比較演算子を使用して比較cast bigintするか、比較演算子にキャストして比較します。nvarcharnvarcharnvarcharbigintbigint

もう 1 つ: これらの列の型をそのままにしておく必要がある場合tableA.columnA2tableB.columnB2' このクエリを書き直してパフォーマンスを向上させるにはどうすればよいでしょうか?

注: このクエリは約 100,000 レコードに対してのみ機能しますが、永遠に時間がかかります。

よろしくお願いします。

4

2 に答える 2

2

編集:変換は常に更新されたテーブルのデータ型に行われると想定していました。しかし、これは間違っています!質問と同様のステートメントでテストしたので、@podiluskaの答えは正しいです。updateステートメントの計画では、bigintとnvarchar列を比較すると、変換が常にbigintであることがわかります。 bigint または nvarchar 列が更新されたテーブルの側にある: クエリ プランには常にScalar Operator(CONVERT_IMPLICIT(bigint,[schema1].[table1].[col1],0))nvarchar 列の式が含まれます。

パフォーマンスを向上させるために、式 を使用して nvarchar 列を含むテーブル B に計算列を作成できますcast(ColumnA2 as bigint)。次に、これと columnB1 にインデックスを作成できます。

于 2013-07-31T09:08:22.490 に答える