Я очень ржавый в своем SQL, и я хочу убедиться, что я не пишу что-то, что не будет работать при любом типе нагрузки.
У меня есть одна таблица сообщений, которая выглядит следующим образом:
ID int [PK]
ThreadId nvarchar(32)
Read bit
Archived bit
Timestamp datetime
/*---Other non-relevant columns---*/
Sender_MemberId int [FK]
Receiver_MemberId int [FK]
Как и в Gmail, я хочу иметь возможность извлекать все потоки и все сообщения этого потока на основе обычного использования сообщений (входящие, отправленные, заархивированные и т. Д.).
Вот SQL, который я сейчас использую для входящих сообщений:
SELECT * FROM [Messages]
WHERE [ThreadId] IN
(
SELECT [ThreadId]
FROM [Messages]
WHERE ([Receiver_MemberId] = @MemberId)
)
ORDER BY [ThreadId] DESC, [Timestamp] DESC
Это работает, как я хочу, но есть ли лучший способ сделать это?Или, если нет, что я должен иметь индексы?
ОБНОВЛЕНИЕ: В соответствии с хорошим предложением Аарона, я добавил подкачку и сократил объем информации, которую извлекаю сразу.
Новый SQL:
SELECT DISTINCT m.[ThreadId], m.[Subject], m.[To], m.[From], m.[Timestamp]
FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY MessageId) AS RowNumber , ThreadId
FROM [Messages]
WHERE [Sender_MemberId] = @p1
)
AS t
INNER JOIN [Messages] m ON m.ThreadId = t.ThreadId
WHERE t.RowNumber BETWEEN @Skip + 1 AND @Skip + @Take
ORDER BY [Timestamp] DESC