Здесь есть несколько возможностей ...
Сохраняется ли запрос в хранимой процедуре, и были ли индексы созданы после хранимой процедуры? Если это так, перекомпилируйте в хранимую процедуру, чтобы заставить SQL Server генерировать новый план выполнения.
В противном случае может показаться, что это связано с объединением подзапроса. Если это так, SQL Server определяет, что (fldPlayerDateAdded >= DATEADD(dd, - 4, @DateAdded))
является наиболее важным предикатом. Поэтому он сначала генерирует результаты подзапроса, а затем присоединяется к таблице tblHero. Это дает как минимум два варианта ...
РЕДАКТИРОВАТЬ - Это может быть отчасти связано с тем, что все предложения ORDER BY взяты из подзапроса. Возможно, попробуйте без ORDER BY, чтобы увидеть, имеет ли это какое-либо отношение.
Во-первых, если нет, вы можете добавить индекс для (fldPlayerDateAdded, fldPlayerName) в tblPlayer. Это, возможно, позволит оптимизатору сначала отфильтровать таблицу tblHero, а затем присоединиться к подзапросу.
В качестве альтернативы, чтобы сохранить тот же базовый план выполнения, но ускорить его, включите поле fldHeroOwner в свои индексы на tblHero.
Примечание. Для вас может быть полезно предоставить полный фактический план выполнения, чтобы лучше определить, что происходит и как его предотвратить.