sql - 一张数据库表海量请求最优解

标签 sql sql-server database

我们有一个系统,按照先到先得的原则为客户分配产品。

我们的产品表包含一个从零开始的递增主键,我们用它来跟踪已分配了多少产品,即一个用户预订了一个产品并分配了 1 个,下一个用户分配了 2 个等等。

问题是,在任何给定的时间内,可能会有数十万用户访问该系统。所有人都将坐在这张 table 上。

由于我们需要确保每个客户只分配一个产品并跟踪分配了多少产品,我们为每个访问系统的客户使用行锁以确保他们在下一个客户点击之前写入表系统 - 即执行先到先得的规则。

我们关注的瓶颈是每个请求进入 SQL Server 2008 Enterprise Edition 和行锁的处理时间。

我们不能使用多个服务器,因为我们需要确保主键的完整性,这样任何需要复制的东西都不会起作用。

有没有人知道有什么好的解决方案可以特别有效地处理对一个数据库表的大量请求?

更多信息:
有问题的表基本上只包含两个字段 - ID 和 CustomerID。该解决方案是免费赠送一百万种产品——因此预期会有很高的需求,以及为什么使用递增的主键作为键对我们来说很有意义——一旦键达到一百万,就没有更多的客户可以注册了。此外,产品各不相同,因此分配正确的 key 很重要,例如进入的前 100 位客户收到的产品值(value)高于接下来的 100 位客户等等

最佳答案

首先,为了消除 key 生成的问题,我会提前生成它们。它只有 100 万行,这意味着您不必担心管理 key 生成过程。这也意味着您不必担心会意外生成太多行,因为一旦您填满了表,您将只会执行 UPDATE,而不会执行 INSERT。

这里的一个重要问题是,所有 100 万件商品是否都相同?如果是,那么 key 的顺序(或者即使它们有顺序)并不重要,因此当客户提交请求时,您只需“尝试”更新表,大致如下所示:

UPDATE TOP(1) dbo.Giveaway -- you can use OUTPUT to return the key value here
SET CustomerID = @CurrentCustomerID
WHERE CustomerID IS NULL

IF @@ROWCOUNT = 0 -- no free items left
PRINT 'Bad luck'
ELSE
PRINT 'Winner'

另一方面,如果 1m 项不同,那么您需要另一种解决方案,例如项目 1 是 X,项目 2-10 是 Y,11-50 是 Z 等。在这种情况下,按照提交请求的顺序将客户分配给键很重要,因此您可能应该研究某种排队系统,也许使用服务代理。每个客户向队列添加一个请求,然后存储过程一次处理一个请求并为他们分配 MAX 免费 key ,然后返回他们赢得的详细信息。

关于sql - 一张数据库表海量请求最优解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9900576/

相关文章:

sql-server - Sequelize JS - 如何处理 Sequelize 不支持的 SQL Server 数据类型

c# - 如何将大数组发送到存储过程

mysql - 如果特定表上存在缺失行,如何处理 SQL 连接

sql - 在 WHERE 子句中使用别名

java - HSQLDB 数据库中神秘的完整性约束违规

C# 方法返回连接到不同数据库

python - 将多个 if 语句缩减为一个表

sql - 有没有一种方法可以使用纯 SQL 进行计数和循环?

java - hibernate 或数据库 : Which is better place for foreign key constraints?

mysql - 错误1452:无法添加或更新子行:外键约束失败