我有一个数据库表 UserRewards 有 30+ 百万行。在这一行中,每行有一个用户 ID 和一个奖励 ID(以及其他字段)。
有一个 users 表(有大约 400 万唯一用户),它具有主键 userID 和其他字段。出于性能原因,我想将 userrewards 中每个用户的奖励 ID 移动到 users 中的串联字段中。(名为 Rewards 的新 nvarchar(4000) 字段)我需要一个可以尽快完成此操作的脚本。
我有一个光标,它使用下面的脚本来连接奖励,但它每分钟只处理大约 100 个用户,这需要很长时间才能通过我拥有的大约 400 万唯一用户。
set @rewards = ( select REPLACE( (SELECT rewardsId AS [data()] from userrewards
where UsersID = @users_Id and BatchId = @batchId
FOR XML PATH('') ), ' ', ',') )
有什么建议可以优化吗?我将尝试一个 while 循环,看看它是如何工作的,但任何其他想法都会受到极大的欢迎。
编辑:
我的网站执行以下操作:
我们有大约 400 万用户,他们已经预先分配了 5-10 个“奖励”。这种关系在 userrewards 表中。
用户来到网站,我们识别他们,并在数据库中查找分配给他们的奖励。
问题是,该站点非常受欢迎,因此我有大量的人同时访问该站点以请求他们的数据。以上将减少我的加入,但我知道这可能不是最好的解决方案。我的数据库服务器在打开站点后的 10 秒内达到 100% 的 CPU 使用率,因此大多数人的请求超时(显示错误页面),或者他们得到结果,但不是在令人满意的时间。
有人可以为我的问题提出更好的解决方案吗?