SQL Server:返回每行的唯一生成值

时间:2017-02-03 10:13:43

标签: sql sql-server tsql

要求是从存储过程返回每个已处理行的唯一值,该行将像伪主键一样使用。一个解决方案似乎是使用ROW_NUMBER()函数。另一个是here。也许,可以有涉及Guid的解决方案。有人可以推荐一个高效且可靠的解决方案吗?

1 个答案:

答案 0 :(得分:0)

  • 随机数不是一个选项(因为您指定唯一)。

  • ROW_NUMBER是一个bigint,每行占用8个字节的存储空间。

  • uniqueidentifier是一个16字节的结构,获得的成本比仅增加ROW_NUMBER的成本更高(SQL的唯一标识符是GUID,NEWID()正在慢于NEWSEQUENTIALID()因为NEWSEQUENTIALID()将从种子GUID增加。

  • INSERT进入表变量或临时表的情况下,您可以使用IDENTITY。存储大小是列数据类型的大小,可以是任何整数类型(无位,无小数)。它将在可配置的步骤(默认值为1)中从可配置的偏移量(默认值1)递增。

这似乎使ROW_NUMBER最适合您,它既快速又可靠。

我建议您的设计选择不仅仅是性能。在任何合理配置的SQL Server安装上,您几乎都不会注意到速度的差异,除非您拥有非常有限的资源,否则存储也不应成为瓶颈。一些相当古老的benchmarks here

请注意,两者都无法帮助您维护或保证所返回行的特定顺序 - 如果您需要可预测的结果,则仍需要ORDER BY最外层的SELECT