- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我们有一个系统,按照先到先得的原则为客户分配产品。
我们的产品表包含一个从零开始的递增主键,我们用它来跟踪已分配了多少产品,即一个用户预订了一个产品并分配了 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/
“大规模”的微型 ORM 是否有处理继承的方法? robconery / massive 为 Massive 编写提供程序很难吗? 我需要非常接近 SQL Server 的东西。作为第一步,最好拦截
我编写了一个服务器可以使用的应用程序。此应用程序收集信息,并将其发送到服务器。每 10 秒执行一次。数据量取决于玩游戏的玩家,但让我们将其保持在大约 50 个服务器,每个服务器发送 100 条数据(每
我有一个表,其中包含 3 个字段(用户名、目标值、分数),由用户名 (~400,000) 和目标值 (~4000) 的完整交叉在外部生成,并计算出分数,导致总行数约为 16 亿. 我在这个表上的所有查
我们包括了这个 AndroidPdfViewer library支持在应用程序中查看 PDF 报告。它导致 APK 大小从 4.7Mb 大幅增加到 20.1Mb。 有没有办法减小这个尺寸。让我知道在哪
我在脑海中争论是否应该在 MySQL 中使用大量的多维数组或数据库。我正在为一个业务有很多产品的客户开发。在这个多维数组中,我将包括每个产品的产品标题、描述、图片链接和类别。 我的客户可能有 1000
我是一名优秀的程序员,十分优秀!