没有重复的范围之间的SQL增量 - 多线程

时间:2017-11-30 18:13:11

标签: sql sql-server sql-server-2016

我会尽力提供尽可能详细的信息。在高事务环境中增加一系列数字的最佳方法是什么,这意味着,来自网络API的呼叫速度非常快?

我拥有的第一个表是可以使用的范围的主表。它在下面说明。我不确定这是否是实施它的最佳方式,所以我愿意接受建议

A公司最初给了我100-200的范围。随着时间的推移,我们开始跑得很低,所以他们给了我们一个新的范围。新范围是201-300。

Company   Range    Inactive
   A      100-200      X
   B      100-200
   C      200-350
   A      201-300  

第二个表是范围之间使用的数字列表。

 Company  Number    DateUsed
   A      198       2017-11-30
   B      199       2017-11-30
   A      200       2017-11-30
   B      105       2017-11-30
   C      215       2017-11-30
   A      201       2017-11-30

一旦范围用完,我需要能够标记该范围,以便它不再使用,并使用下一个可用的范围。我正考虑添加一个" Last Used"编号到第一个表并执行带有输出的Update语句,其中case语句处于非活动状态,标记为非活动状态(如果为空)。

我遇到的问题是在高交易环境中执行此操作的最佳方法是什么?我熟悉Scope_Identity,但我认为这不会适用于此设置。

1 个答案:

答案 0 :(得分:0)

在第一个表中有一个非活动标志对我来说似乎完全正确。我已经编写并测试了一个将更新标志的查询,前提是Range列被拆分为较低范围列和较高范围列。我分别在调用表格RangesRangeLog

UPDATE Ranges
SET Inactive = 'X'
WHERE EXISTS (SELECT tA.Company, RangeLow, RangeHigh, COUNT(*)
              FROM Ranges tA INNER JOIN (SELECT DISTINCT Company, Number 
                                         FROM RangeLog) tB ON tA.Company = tB.Company AND (Number BETWEEN tA.RangeLow AND tA.RangeHigh)
              GROUP BY tA.Company, RangeLow, RangeHigh
              HAVING RangeHigh - RangeLow + 1 = COUNT(*)
                     AND Ranges.Company = tA.Company AND Ranges.RangeLow = tA.RangeLow AND Ranges.RangeHigh = tA.RangeHigh)

显然,这不会像现在一样使用模式,但是将其拆分到Range查找列会使数据更具原子性和可用性,并且更容易编写查询。而且这对你的桌子来说是一个相当小的修改。

告诉我们您的看法!