SQL Server 2012+ 中SEQUENCE
声明的使用NO CACHE
和声明的使用之间有什么区别吗?CACHE 1
序列#1:
CREATE SEQUENCE dbo.MySeqCache1
AS INT
START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 9999
NO CYCLE
CACHE 1;
GO
序列#2:
CREATE SEQUENCE dbo.MySeqNoCache
AS INT
START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 9999
NO CYCLE
NO CACHE;
GO
两者有什么区别吗?在 SQL Server 2012+ 环境中使用时它们的行为会有所不同吗?
在您真正找到不同之处之前,很难对这个问题给出明确的答案。我没有发现,但这并不意味着我没有在我所做的测试中看到任何区别。
简单的测试是性能。要么在循环中获取下一个值,要么使用数字表作为源来一次生成多个值。在我的测试中,不使用缓存和使用 1 值的缓存在性能上没有差异,但使用 2 的缓存有显着的性能提升。
这是我用来测试性能的代码:
结果:
为了更深入地挖掘,我使用了扩展事件
sqlserver.metadata_persist_last_value_for_sequence
,并sqlserver.lock_acquired
查看这些值在系统表中的持久性是否存在不同。我使用这段代码来测试没有缓存和缓存大小为 1 和 4。
不使用缓存和缓存为 1 的输出没有区别。
样本输出:
使用 4 的缓存时。
当
SCH_S
需要一个值时,锁定就完成了。当缓存用尽时,紧随其后的是 aIX
和 aU
锁,最后metadata_persist_last_value_for_sequence
触发事件。因此,在 SQL Server 意外关闭时可能会丢失值时,使用 no cache 和 cache 1 应该没有区别。
最后,在使用缓存 1 创建序列时,我注意到 SSMS 的“消息”选项卡中有一些内容。
因此,SQL Server 认为没有区别并告诉我。
sys.sequences
但是,列中存在差异cache_size
。无缓存时为 NULL,缓存为 1 时为 1。