次のようにユーザーを検索すると:
SELECT *
FROM userprofile
WHERE userid IN (1, 2, 3)
実行計画は、UserProfile が Clustered Index Seek を使用していることを示しています
サブクエリを使用するように IN 句を変更すると、次のようになります。
SELECT *
FROM userprofile
WHERE userid IN (
SELECT DISTINCT senders.UserId
FROM messages m
JOIN UserMessages recipients ON recipients.MessageId = m.MessageId
JOIN UserMessages senders ON senders.MessageId = m.MessageId
WHERE recipients.TypeId = 2
AND recipients.UserId = 1
AND senders.UserId <> 1
AND senders.TypeId = 1
)
実行計画は、サブクエリが Clustered Index Seek を使用していることを示していますが、UserProfile 外部クエリは Clustered Index Scan を使用しています。
内部クエリと外部クエリの両方がシークを使用するようにするにはどうすればよいですか?