SQL Server - 同一列中的多个标识范围

时间:2017-02-24 14:14:09

标签: sql-server grouping auto-increment identity

昨天,我被两个不同的人问了同样的问题。他们的表格有一个将记录组合​​在一起的字段,如一年或一个地点。在这些组中,他们希望拥有一个从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 |

1 个答案:

答案 0 :(得分:0)

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