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