вы получите наилучшую производительность с кластеризованным индексом по столбцам поиска:
(profile_id, is_deleted, owner_id, added_date desc)
недостатком является то, что для поиска строки по идентификатору нужно будет использовать более медленный некластеризованный индекс, поскольку вы можете иметь только один кластеризованный индекс.
если это не вариант, следующим лучшим вариантом будет создание многостолбцового индекса покрытия, включающего:
(profile_id, is_deleted, owner_id, added_date desc, id, comments, is_public)
, поскольку комментарии довольно велики, вы можете включать комментарии в качестве неключевого столбца, используя синтаксис INCLUDE:
create index idx on c (profile_id, is_deleted, owner_id, added_date desc, id,
is_public) include (comments)
комментарии не будут проиндексированы, но вы сможете быстро получить их, когда будут сопоставлены другие ключи.
подробнее здесь:
http://www.sql -server-performance.com / подсказки / * covering_indexes_p1.aspx 1018 ** * 1019
и, конечно, u.id должен быть первичным ключом для пользователей.
лучше всего сделать is_deleted ненулевым (tinyint по умолчанию равно 0).
с NOLOCK / READUNCOMMITTED, выбор не создаст никаких блокировок или блоков.