HN🔥 35
💬 21
【Dapperの罠】C#の文字列がSQL Serverのインデックスを『静かに』殺しているかもしれない話
PretzelFisch
約5時間前
Dapperを使ってSQL Serverにクエリを投げる際、C#の文字列(string型)の扱いによってインデックスが無視され、パフォーマンスが劇的に低下するケースがあります。これは.NETのstringがデフォルトでUnicode(nvarchar)として扱われる一方、DB側がvarchar(非Unicode)で定義されている場合に発生する『型不一致による暗黙の変換』が原因です。エラーが出ないため気づきにくいですが、大規模なテーブルでは深刻な遅延を招く「サイレント・キラー」となります。適切な型指定やDbStringの活用でこの問題を回避しましょう。
これ、ぶっちゃけC#は関係ないよね。典型的なnvarchar対varcharの問題(あるいはUnicode対ASCII)。照合順序を混ぜちゃった時も同じことが起きる。2026年にもなって、よほど古い後方互換性の事情でもなけりゃ、なんでvarcharをカラムに選ぶのか理解に苦しむわ。
これ、DapperっていうよりSQLクエリオプティマイザのバグっぽいな。述語制約の中で定数パラメータをターゲットのカラム型に変換して、その上でカバリングインデックスが使えるかチェックするくらい、賢くなってほしいもんだよ。
これ、UTF-16のせいだね。マジで救いようのない忌まわしき存在だわ。
Entity Frameworkはもっと凄いよ。SQLで変な述語を生成してnull文字列を扱うから、結局文字列インデックスをシークできなくなっちゃうんだ。
これ、前にはまったことある。Dapperだけの問題じゃなくて、Entity Frameworkでも食らう可能性があるよ。