私は自分のSQL上で錆びていて、どんなタイプの負荷でも失敗するものを書いていないことを確認したいと思っています。スレッドとメッセージをプルするSQLを改善しましたか?
私はこのようになり、単一のメッセージテーブルがあります:Gmailのと同様に
ID int [PK]
ThreadId nvarchar(32)
Read bit
Archived bit
Timestamp datetime
/*---Other non-relevant columns---*/
Sender_MemberId int [FK]
Receiver_MemberId int [FK]
を、私は(通常のメッセージングの使用に基づくスレッドと、そのスレッドのすべてのメッセージのすべてを引っ張ることができるようにしたいです受信トレイ、送信済み、アーカイブ済みなど)。
ここで私は現在、受信トレイのために使用しているSQLです:
SELECT * FROM [Messages]
WHERE [ThreadId] IN
(
SELECT [ThreadId]
FROM [Messages]
WHERE ([Receiver_MemberId] = @MemberId)
)
ORDER BY [ThreadId] DESC, [Timestamp] DESC
私が望むように、これは動作しますが、これを行うには良い方法はありますか?そうでない場合は、インデックスはどのようにすべきですか?
UPDATE: Aaronの良い提案では、ページングを追加して、バットからすぐに引き出している情報の量を減らしました。
新しい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スレッド、すべてのスレッド)。 –
Aaron、良い点すべて。私は後でページングを追加することを計画していましたが、今すぐget-goから追加する必要があることを認識しています。一度にすべてのメッセージを取得するという観点から、私はそれらをキャッシュに入れようとしていましたが、それは最善の方法ではないかもしれません。私はそれについてもう少し考えていきます。 – Dave
サイトがアクティブな場合、キャッシュの有効期間はどのくらいですか?サイトが普及している場合は、キャッシュがどれくらい大きくなると思いますか? –