3,000 万行以上のデータベース テーブル UserRewards があります。この行には、ユーザー ID と、行ごとに (他のフィールドと共に) 報酬 ID があります。
ユーザー テーブル (約 400 万の一意のユーザーを持つ) があり、プライマリ キーの userID とその他のフィールドがあります。パフォーマンス上の理由から、userrewards のユーザーごとのrewardID を users の連結フィールドに移動したいと考えています。(Rewards と呼ばれる新しい nvarchar(4000) フィールド) これをできるだけ速く実行できるスクリプトが必要です。
以下のスクリプトを使用して報酬を結合するカーソルがありますが、1 分あたり約 100 人のユーザーしか処理できず、約 400 万人のユニーク ユーザーを取得するには時間がかかりすぎます。
set @rewards = ( select REPLACE( (SELECT rewardsId AS [data()] from userrewards
where UsersID = @users_Id and BatchId = @batchId
FOR XML PATH('') ), ' ', ',') )
これを最適化するための提案はありますか? while ループを試してみようとしているので、それがどのように機能するかを確認しますが、他のアイデアは大歓迎です。
編集:
私のサイトは次のことを行います。
5 ~ 10 の「賞」が事前に割り当てられている約 400 万人のユーザーがいます。この関係は userrewards テーブルにあります。
ユーザーがサイトにアクセスすると、ユーザーを識別し、データベースでユーザーに割り当てられた報酬を検索します。
問題は、サイトが非常に人気があるため、多数の人が同時にサイトにアクセスしてデータを要求していることです。上記は結合を減らしますが、これが最善の解決策ではないことを理解しています. サイトをオンにしてから 10 秒以内にデータベース サーバーの CPU 使用率が 100% に達するため、ほとんどのユーザーの要求はタイムアウトする (エラー ページが表示される) か、結果は得られますが満足のいく時間ではありません。
私の問題に対するより良い解決策を提案できる人はいますか?