Запрос можно оптимизировать тремя способами:
1) Использовать индексы по полям ArticleId и CrossArticleId в таблице Crosses;
2) Использовать группировку по полю CrossArticleId во временной таблице @tempFlatCrosses, чтобы избежать дубликатов при соединении с таблицей Crosses;
3) Использовать оператор EXISTS, вместо INNER JOIN, чтобы проверить наличие соответствующих записей в таблице Crosses, без возврата лишних данных.
-- Создаем индексы по полям ArticleId и CrossArticleId в таблице Crosses
CREATE INDEX idx_crosses_articleid ON Crosses (ArticleId);
CREATE INDEX idx_crosses_crossarticleid ON Crosses (CrossArticleId);
-- Достаем все строки, у которых ArticleId = 1 и группируем по CrossArticleId
SELECT ArticleId, CrossArticleId
INTO @tempFlatCrosses
FROM Crosses
WHERE ArticleId = 1
GROUP BY CrossArticleId;
-- Делаем выборку из таблицы Crosses, используя оператор EXISTS
SELECT c.ArticleId
FROM Crosses c
WHERE EXISTS (
SELECT 1
FROM @tempFlatCrosses f
WHERE c.CrossArticleId = f.CrossArticleId
);