Existe alguma diferença entre um SEQUENCE
uso declarado NO CACHE
e um uso declarado CACHE 1
no SQL Server 2012+?
Sequência nº 1:
CREATE SEQUENCE dbo.MySeqCache1
AS INT
START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 9999
NO CYCLE
CACHE 1;
GO
Sequência nº 2:
CREATE SEQUENCE dbo.MySeqNoCache
AS INT
START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 9999
NO CYCLE
NO CACHE;
GO
Existe alguma diferença entre os dois? Eles se comportarão de maneira diferente ao serem usados em um ambiente SQL Server 2012+?
É difícil dar uma resposta definitiva sobre esta questão até que você realmente encontre uma diferença. Não encontrei nenhum, mas isso não significa que não haja diferença, apenas que não vi nenhum nos testes que fiz.
O teste fácil é para desempenho. Obtendo o próximo valor em um loop ou usando uma tabela de números como fonte para gerar vários valores por vez. Em meus testes, não houve diferença de desempenho entre usar nenhum cache e um cache de valor 1, mas houve uma melhoria significativa de desempenho ao usar um cache de 2.
Este é o código que usei para testar o desempenho:
Resultado:
Para aprofundar um pouco mais, usei os eventos estendidos
sqlserver.metadata_persist_last_value_for_sequence
esqlserver.lock_acquired
para ver se havia algo diferente em como os valores persistem na tabela do sistema.Eu usei este código para testar sem cache e tamanho de cache de 1 e 4.
Não há diferença na saída para não usar cache e cache de 1.
Exemplo de saída:
Ao usar um cache de 4.
O
SCH_S
bloqueio é feito quando um valor é necessário. E quando o cache está esgotado, é seguido por umIX
e oU
bloqueio e, finalmente, o eventometadata_persist_last_value_for_sequence
é acionado.Portanto, não deve haver diferença entre não usar cache e cache 1 quando se trata de valores potencialmente perdidos em um desligamento inesperado do SQL Server.
Por fim notei algo na aba Mensagem no SSMS ao criar uma sequência com o cache 1.
Portanto, o SQL Server acha que não há diferença e me diz isso. No entanto, há uma diferença na
sys.sequences
colunacache_size
. É NULL para nenhum cache e 1 para um cache de 1.