エンティティ データ モデル (.NET 4.0) にクエリを実行していますが、ローカルで実行した場合と開発サーバーから実行した場合とで大きく異なる結果が得られます。ローカルではクエリに 10 秒かかりますが、開発サーバーでは 7 分かかります。両方の環境が同じ SQL 2005 データベース (つまり、まったく同じ接続文字列) をヒットしています。
生成された基礎となる SQL を調べたところ、2 つの環境で異なることがわかりました。開発サーバー上のコードによって生成されたクエリには、劇的な速度低下を引き起こしている余分なサブクエリがいくつかあります。では、各環境の SQL コード ジェネレーターが同じクエリに対して異なる結果を生成する原因は何でしょうか?
更新 - (誤解を招くため、古いサンプルを削除しました)
速度低下の原因を突き止めましたが、同じデータベースに対して同じコード ベースを実行しているときに、2 つの異なる SQL クエリが生成される理由はまだわかりません。
コードをローカルで実行すると、クエリ内のすべての定数文字列が通常の文字列として SQL クエリ文字列に配置されます。サーバーで同じコードを実行すると、生成された SQL によって文字列が Unicode 文字列に変換されます。
ローカルで生成:
WHERE (「拒否」 <> [エクステント 1].[ステータス] )
サーバー上で生成:
WHERE (N'DENY' <> [Extent1].[ステータス] )
文字列の Unicode の「N」表記を追加および削除すると、実行時間が劇的に変わります。これで、クエリが遅い理由はわかりましたが、サーバー上の SQL コード ジェネレーターがこれらの文字列を Unicode にしている理由はまだわかりませんが、ローカルで実行するとそうではありません。エンティティ データ モデルを確認したところ、「ステータス」列の Unicode プロパティが False に設定されているため、クエリが Unicode に変換される理由がわかりません。