在他对哪个更好:标识列或生成的唯一 id 值的回答中?mrdenny 说:
当 SQL Denali 出现时,它将支持比身份更有效的序列,但您无法自己创建更高效的东西。
我不确定。了解 Oracle 的序列后,我必须为插入创建触发器,将每个插入封装到存储过程的调用中,或者祈祷我在执行临时插入时不要忘记正确使用序列。
我怀疑序列的优势是否如此明显。
在他对哪个更好:标识列或生成的唯一 id 值的回答中?mrdenny 说:
当 SQL Denali 出现时,它将支持比身份更有效的序列,但您无法自己创建更高效的东西。
我不确定。了解 Oracle 的序列后,我必须为插入创建触发器,将每个插入封装到存储过程的调用中,或者祈祷我在执行临时插入时不要忘记正确使用序列。
我怀疑序列的优势是否如此明显。
我也会在这里回答。它与如何
IDENTITY
和SEQUENCE
工作的内部结构有关。使用
IDENTITY
,SQL Server 将值预缓存到内存中,以便它们随时可用。有关详细信息,请参阅Martin Smith 的答案。随着值的使用,后台进程会生成更多值。正如您可以想象的那样,这个池可以很快用完,使应用程序受制于生成值的后台进程。使用
SEQUENCE
,SQL Server 允许您定义缓存的大小。虽然 SQL Server 实际上并没有将值保留在缓存中,它只保留当前值和顶端值,这将大大减少创建值所需的 IO 量。不要将缓存设置得太高,因为这会减少可以使用的数字数量:如果 SQL Server 崩溃,则在当前缓存范围中指定的任何未使用的值都将丢失。
至于行插入,只需为列指定一个默认值,如下所示:
自从写了 Itzik Ben Gan 文章以来,硬编码缓存大小 10
IDENTITY
似乎已经改变。从这个连接项目的评论T-SQL 查询一书包含下表,但强调这些值未记录或保证不变。
这里的文章测试了各种序列缓存大小和插入批量大小,并得出以下结果。
这似乎表明对于大型插入
IDENTITY
执行SEQUENCE
。但是,它不会测试缓存大小 1,000,而且这些结果只是一项测试。特别查看缓存大小 1,000 和不同批量大小的插入,我得到以下结果(尝试每个批量大小 50 次并将结果汇总如下 - 所有时间以 μs 为单位。)对于较大的批量大小,该
IDENTITY
版本似乎通常更快。TSQL 查询一书还解释了为什么
IDENTITY
比序列具有性能优势。这
IDENTITY
是特定于表的,SEQUENCE
不是。如果灾难是在刷新日志缓冲区之前发生中间插入,则恢复的标识是否是较早的标识无关紧要,因为恢复过程也将撤消插入,因此 SQL Server 不会强制刷新每个标识上的日志缓冲区缓存相关的磁盘写入。但是,对于 Sequence,这是强制执行的,因为该值可能用于任何目的 - 包括在数据库之外。因此,在上面的示例中,插入一百万次,缓存大小为 1,000,这是额外的一千次日志刷新。重现的脚本