と呼ばれるテーブルがありますPurchases
:
| PRSNumber | ... | ... | ProjectCode |
| PRJCD-00001 | | | PRJCD |
| PRJCD-00002 | | | PRJCD |
| PRJCD-00003 | | | PRJCD |
| PRJX2-00003 | | | PRJX2 |
| PRJX2-00003 | | | PRJX2 |
注:ProjectCode
はのプレフィックスですPRSNumber
。
以前は、テーブルにフィールドがない場合、ProjectCode
以前の開発者はこのクエリを使用して特定のサプライヤーとの購入を検索していました。
select * from Purchases where left(PRSNumber,5) = @ProjectCode
PRSNumber
はい、を取得して比較するために、を連結しProjectCode
ます。ただし、上記のコードは、テーブルのデザインに関係なく正常に機能します。
しかし、新しいフィールド、、を追加したとき、次のProjectCode
クエリを使用します。
select * from Purchases where ProjectCode = @ProjectCode
私はこの例外を受け取ります:
タイムアウトが期限切れになりました。操作が完了する前にタイムアウト期間が経過したか、サーバーが応答していません。
比較の前に連結が必要な最初のクエリが、比較以外の何もしなければならない2番目のクエリよりも高速であるとは信じられません。なぜこれが起こっているのか教えていただけますか?
役立つかもしれないいくつかの情報:
PRSNumber
主キーはvarchar(11)
であり、主キーですProjectCode
はnvarchar(10)
- どちらのクエリもSQLServerManagementStudioで正常に機能します
- 最初のクエリはASP.NETWebサイトで機能しますが、2番目のクエリは機能しません
ProjectCode
インデックスが付けられます- テーブルには32k行があります
アップデート
ProjectCode
インデックスに登録されましたが、まだ運がありません