我有一个数据库表,UserRewards拥有三千万以上的行。在这一行中,每行都有一个用户ID和一个奖励ID(以及其他字段)。将多行转换为单列
有一个用户表(具有约400万独立用户),具有主键的用户ID等领域。 由于性能方面的原因,我希望将userrewards中每个用户的奖励ID移动到用户的连接字段中。 (新的nvarchar(4000)字段称为奖励) 我需要一个脚本,可以尽快做到这一点。
我用下面的脚本加入了奖励光标,但它只有大约每分钟100个用户,这将需要时间太长得到尽管约400万独立用户我处理。
set @rewards = (select REPLACE((SELECT rewardsId AS [data()] from userrewards
where UsersID = @users_Id and BatchId = @batchId
FOR XML PATH('') ), ' ', ','))
任何建议,以优化?我即将尝试一段时间循环,看看它是如何工作的,但任何其他想法都会被大大接受。
编辑:
我的网站具有以下功能:
我们有大约400万用户谁已预先分配5-10“大奖”。这种关系在用户对话表中。
的用户来到现场,我们确定他们,查找在数据库中分配给他们的奖励。
的问题是,该网站是非常受欢迎的,所以我有大量的人访问该网站,同时请求他们的数据。以上将减少我的加入,但我知道这可能不是最好的解决方案。我的数据库服务器在我调整网站的10秒内达到100%的CPU使用率,所以大多数人的请求超时(它们显示为错误页面),或者他们得到结果,但不是在令人满意的时间。
有人能够提出一个更好的解决我的问题?
...真的吗?我已经可以告诉你,在SQL中使用分隔列(多值列)是**真的**严重不满。 “对于性能”并不是一个令人信服的理由(查询该列往往比其值得的更麻烦) - 通常它们最终分列在分析数据库的不同列中。 4mil排马马虎虎,但花生在任何专用系统上。另外,游标/循环在SQL中通常是错误的(通常这可能是性能问题的最大部分)。你想要解决什么_actual_问题。还有哪些其他查询“很慢”? –
查询速度很快,但我有5k-10k用户同时点击我的服务器,请求来自userrewards表的数据。 (拥有3000万行的那个)。这将加入到用户表和文件管理器上,并由用户提供唯一标识符。我在一列中更新的代码实现了更好的缓存,并且不会进行任何连接,速度也会提高很多。我只需要尽可能快地将我当前的大数据集转换为正确的格式。现在,SQL服务器是一个专用的盒子。我需要看到关于ugradding它..我应该RAM,CPU或两者?目前8GB的内存,2.00 zeon CPU – mp3duck
就单列的东西而言,虽然它可能会皱眉,但我有效的代码比以前更快。 – mp3duck