この同じトピックに関する他のスタックオーバーフローの議論があります(下部のリンク)。上記のコメントに記載されているように、インデックスとオプティマイザが混乱して間違ったものを使用していることに関係している可能性があります。
私の最初の考えは、(select * ....)からselect top serviceidを実行していて、オプティマイザーがクエリを内部クエリにプッシュしてインデックスを使用するのが難しい場合があるということです。
次のように書き直すことを検討してください
select top 10 ServiceRequestID
from big_table_1
inner join big_table_2 cap2
on cap1.servicerequestid = cap2.customerreferencenumber
and big_table_1.statusid = 2
クエリでは、データベースはおそらく結果をマージして返し、外部クエリの上位10に制限しようとしている可能性があります。上記のクエリでは、結果がマージされるときにデータベースが最初の10個の結果を収集するだけで済み、時間の負荷を節約できます。また、servicerequestIDにインデックスが付けられている場合は、必ずそれを使用します。あなたの例では、クエリは、仮想のインデックス付けされていない形式ですでに返されている結果セット内のservicerequestid列を探しています。
それが理にかなっていることを願っています。仮に、オプティマイザーはSQLを入力する形式を採用し、毎回値を返すための最良の方法を見つけることになっていますが、実際には、SQLを組み合わせる方法は、特定の手順が実行される順序に実際に影響を与える可能性があります。 DB。
SQL Serverのインデックス付き列でtop(1)を実行するのが遅いのはなぜですか?