2011-08-25 14 views
0

私は自分の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 
+1

本当にすべてのスレッドとすべてのメッセージを一度にプルする必要がありますか?私は一般的にあなたがスレッドを選択するまで "ドリルイン"ではなく、スレッドのすべてのスレッドタイトル(および多分メッセージの数)を取得する必要があると言うでしょうし、そのスレッドのすべてのメッセージを取得します。すべてのスレッドとすべてのメッセージを取得している場合、Googleのアプローチから取れる別の方法はページングです(たとえば、一度に50スレッド、すべてのスレッド)。 –

+0

Aaron、良​​い点すべて。私は後でページングを追加することを計画していましたが、今すぐget-goから追加する必要があることを認識しています。一度にすべてのメッセージを取得するという観点から、私はそれらをキャッシュに入れようとしていましたが、それは最善の方法ではないかもしれません。私はそれについてもう少し考えていきます。 – Dave

+0

サイトがアクティブな場合、キャッシュの有効期間はどのくらいですか?サイトが普及している場合は、キャッシュがどれくらい大きくなると思いますか? –

答えて

1

あなたは、サブクエリを必要としない、これはそれがむしろ使用よりも、あなたが必要とする列に名前を付けることをお勧めだ

  SELECT Id 
     , [ThreadId] 
     , read 
     , archived 
     , timestamp 
  FROM [Messages] 
  WHERE [Receiver_MemberId] = @MemberId 
    ORDER BY [ThreadId] DESC, [Timestamp] DESC 

行う必要があります*

+1

*スレッドIDで注文する必要がありますか?*おそらく。ほとんどのサイトはスレッドのリストを表示し、そのスレッドの下にあるすべてのメッセージを展開して表示します。タイムスタンプで注文すると、スレッド1からのメッセージ、次にスレッド12からのメッセージ、スレッド24からのメッセージ、スレッド1からの別のメッセージを持つことができます。 –

+0

良い点Aaron、それに応じて応答を修正します –

関連する問題