【问题标题】:SQL Server - Multiple Identity Ranges in the Same ColumnSQL Server - 同一列中的多个标识范围
【发布时间】:2017-07-15 09:59:39
【问题描述】:

昨天,两个不同的人问了我同样的问题。他们的表有一个将记录组合​​在一起的字段,例如年份或位置。在这些组中,他们希望拥有一个从 1 开始并按顺序递增的唯一 ID。显然,您可以搜索MAX(ID),但如果这些应用程序有大量流量,它们需要锁定整个表以确保不会多次返回相同的 ID。我考虑过使用序列,但这意味着为每个组动态创建一个序列。

示例 1:

在这一年中创建的记录应加一,然后在明年年初从 1 重新开始。

| Year | ID |
|------|----|
| 2016 |  1 |
| 2016 |  2 |
| 2017 |  1 |
| 2017 |  2 |
| 2017 |  3 |

示例 2:

一家公司有许多地点,他们希望为每个客户生成一个唯一的 ID,将地点 ID 与递增的 ID 结合起来。

| Site | ID |
|------|----|
| XYZ  |  1 |
| ABC  |  1 |
| XYZ  |  2 |
| XYZ  |  3 |
| DEF  |  1 |
| ABC  |  2 |

【问题讨论】:

  • 你的问题是什么?
  • 从数据的角度来看,这听起来是个非常糟糕的主意。当一行被删除时会发生什么?您是否需要重新编号所有内容或空白是否正常?在某些点重新启动的自动编号组是有时会出现的事情之一,它几乎总是其他地方设计不佳的标志。
  • 是否有直接的方法来生成这些 ID?我想确保该解决方案在高流量环境中运行良好。是否有一些开箱即用的东西,或者它是否足够奇怪以至于需要手工制作。
  • @SeanLange 我猜它应该像一个标识列,即使删除了一条记录,它也会无限增加。
  • 除非您需要这些值来持久化,否则为什么不直接使用 ROW_NUMBER?按站点分区,TheYearColumn,按 SomeColumn 排序

标签: sql-server grouping auto-increment identity


【解决方案1】:

一个经常使用不足的技巧是在 Site / ID 或 Year / ID 上创建聚集索引 - 但是将 ID 列的顺序更改为 Desc 而不是 ASC。 这样,当您需要扫描 CI 以获取 Next ID 值时,只需检查聚集索引中的 1 行。我已经在 Multi-Billion Record 表上使用了它,它运行得非常快。您可以通过按站点或年份对表进行分区来获得更好的性能,然后在运行 MAX(ID) 查询时获得分区消除的额外好处。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多