Несколько вещей:
- Вы не можете получить теги всех сообщений пользователей. В настоящее время существует более 41 миллиона сообщений и SEDEограничивает результаты до 50 000 строк .
- Итак, вам необходимо: (A) каким-либо образом ограничить результаты или (B) от страницы до 41 M сообщений,50K за раз (НЕ РЕКОМЕНДУЕТСЯ) или (C) вместо этого используйте Дамп данных или Google BigQuery ($) .
- Если вы не собираетесь тянутьничего из таблицы
Users
, кроме ID, не включайте эту таблицу.Он жует циклы, и Posts.OwnerUserId
- это то же самое. - Избегайте
UNION
операторов, если это возможно (именно в этом случае). - При использовании
UNION
операторов используйте UNION ALL
если возможно (именно в этом случае).Это избавляет ядро от необходимости выполнять повторные проверки.
Итак, вот план выполнения для исходного запроса:
Вот оптимизированный план:
И запрос, соответствующий:
SELECT TOP 50000
p.OwnerUserId AS [User]
, p.Id AS [Post Id]
, CASE WHEN p.PostTypeId = 1 THEN 'Q' ELSE 'A' END AS [Type]
, COALESCE (p.Title, ownr.Title) AS [Title]
, p.Body
, COALESCE (p.Tags, ownr.Tags) AS [Tags]
, p.CreationDate
FROM Posts p
LEFT JOIN Posts ownr ON ownr.ID = p.ParentId
WHERE p.OwnerUserId = ##UserId##
AND p.PostTypeId IN (1, 2) -- Question, answer
ORDER BY p.OwnerUserId DESC, p.CreationDate
, что также дает более читабельные результаты, особенно при удалении предложения WHERE
.
Но, если вы можете ограничить, скажем,пользователь перед рукой;вы получаете даже более эффективный запрос :
WITH usersOfInterest AS (
SELECT TOP 10
u.Id AS [UserId]
, u.DisplayName
FROM Users u
ORDER BY u.Reputation DESC
)
SELECT
[User] = 'site://u/' + CAST(u.UserId AS NVARCHAR) + '|' + CAST(u.UserId AS NVARCHAR)
, p.Id AS [Post Id]
, CASE WHEN p.PostTypeId = 1 THEN 'Q' ELSE 'A' END AS [Type]
, COALESCE (p.Title, ownr.Title) AS [Title]
, p.Body
, COALESCE (p.Tags, ownr.Tags) AS [Tags]
, p.CreationDate
FROM usersOfInterest u
INNER JOIN Posts p ON u.UserId = p.OwnerUserId
LEFT JOIN Posts ownr ON ownr.Id = p.ParentId
WHERE p.PostTypeId IN (1, 2) -- Question, answer
ORDER BY u.UserId DESC, p.CreationDate
(этот запрос добавляет удобную гиперссылку к идентификатору пользователя.)
Обратите внимание, чтотолько у 10 лучших пользователей более 50 тыс. сообщений.