我對我的SQL超級生鏽,我想確保我不寫任何在任何類型的負載下都會失敗的東西。更好的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
您是否真的需要將所有線程和所有消息放在一起?我會說,一般來說,你需要拉出所有的線程標題(也許是消息的計數),但不要「鑽入」,直到他們選擇一個線程,然後你去獲得該線程的所有消息。如果你得到所有的線程和所有的消息,那麼你可以從Google的方法中採取另一種策略:分頁(例如,一次50個線程,而不是所有線程)。 –
亞倫,好點都好。我曾計劃在稍後添加分頁,但現在意識到我需要從一開始就添加分頁。就一次性獲取所有消息而言,我將把它們放入緩存中,但這可能不是最好的方式。我會再考慮一下。 – Dave
如果您的網站處於活動狀態,您希望您的緩存有效多久?如果該網站很受歡迎,您預計您的緩存有多大? –