SQLServer Tips:パフォーマンス解析

たかが1件処理するのに5分かかるストアドがある。
「ぜってぇーあやしいでごぜーますだー」(ドコの人?)
と意気込んで調査に乗り込んだ...


結論から先に述べると
「WHERE句に設定する抽出条件の値は対象となる列の
 データ型と必ず一致させること」
という結果となった。
その経緯なのだが、プロファイラや実行プランによって
解析したところ、あるDELETE文が実行時間の約半分を
示していることが発覚した。
ぱっと見てもおかしなところがない。
前の経験から新たに適しているINDEXを作成したが
5%くらいしか向上していない。
で、よーく実行プランを見るとWHERE句に記載した
抽出条件が内部実行時にCONVERTによる暗黙変換が
されていることが発覚した。

テーブル名:[TableAlpha]
列名:[ColumnA]
列型:VARCHAR(4)
用途:西暦が入っている

このテーブルに対してのSQLとして
WHERE ColumnA = 2006
という記述を行っていたが、実行プランによる内部的?な
SQLでは
WHERE ColumnA = CONVERT(2006 AS VARCHAR(4))
↑失念...でもこんな感じだった...
となっており、「内部的な暗黙のCONVERT変換」が
かかっていた...まぁ要は「適切なWHERE句になっていない」
ことが原因なのだが...

で、そのストアドを全て見直して
修正前:WHERE ColumnA = 2006
修正後:WHERE ColumnA = '2006'
と修正をかけていったところ、
修正前処理時間:約5分
修正後処理時間:15秒
ナゼにこんなに違う?と違う疑問が湧くほど適切な処理時間
に戻りましたとさ。

この「内部的な暗黙のCONVERT変換」がネックな理由は
前の

[WHERE句にユーザー関数はご法度の巻き]
http://d.hatena.ne.jp/tamitamy/20050515/1116765533

にある通り、WHERE句に関数はまずいのが原因かと思われる...