AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 140074
Accepted
marc_s
marc_s
Asked: 2016-06-01 21:17:05 +0800 CST2016-06-01 21:17:05 +0800 CST 2016-06-01 21:17:05 +0800 CST

Sequência - SEM CACHE vs CACHE 1

  • 772

Existe alguma diferença entre um SEQUENCEuso declarado NO CACHEe um uso declarado CACHE 1no 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+?

sql-server sql-server-2012
  • 1 1 respostas
  • 5722 Views

1 respostas

  • Voted
  1. Best Answer
    Mikael Eriksson
    2016-06-02T22:43:31+08:002016-06-02T22:43:31+08:00

    É 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:

    declare @D datetime = getdate();
    
    declare @I int = 0;
    while @I < 9999
      select @I = next value for dbo.S;
    
    select datediff(millisecond, @D, getdate());
    

    Resultado:

    Cache        Time(ms)
    ------------ --------
    NO CACHE     1200
    1            1200
    2             600
    1000           70  
    

    Para aprofundar um pouco mais, usei os eventos estendidos sqlserver.metadata_persist_last_value_for_sequencee sqlserver.lock_acquiredpara 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.

    DECLARE @S NVARCHAR(max) = '
    CREATE EVENT SESSION SeqCache ON SERVER 
    ADD EVENT sqlserver.lock_acquired(
        WHERE (sqlserver.session_id=({SESSIONID}))),
    ADD EVENT sqlserver.metadata_persist_last_value_for_sequence(
        WHERE (sqlserver.session_id=({SESSIONID}))) 
    ADD TARGET package0.event_file(SET filename=N''d:\SeqCache'');';
    
    SET @S = REPLACE(@S, '{SESSIONID}', CAST(@@SPID AS NVARCHAR(max)));
    
    EXEC (@S);
    
    GO
    
    CREATE SEQUENCE dbo.S
    AS INT
        START WITH 1
        INCREMENT BY 1
        MINVALUE 1
        MAXVALUE 9999
        NO CYCLE
        NO CACHE;
    --    CACHE 1;
    --    CACHE 4;
    
    GO
    
    ALTER EVENT SESSION SeqCache ON SERVER STATE = START;
    
    GO
    
    DECLARE @I INT = 0;
    WHILE @I < 10
      SELECT @I = NEXT VALUE FOR dbo.S;
    
    GO
    
    ALTER EVENT SESSION SeqCache ON SERVER STATE = STOP;
    DROP EVENT SESSION SeqCache ON SERVER;
    DROP SEQUENCE dbo.S;
    

    Não há diferença na saída para não usar cache e cache de 1.

    Exemplo de saída:

    name                                      persisted_value mode
    ----------------------------------------- --------------- -----
    lock_acquired                             NULL            SCH_S
    lock_acquired                             NULL            IX
    lock_acquired                             NULL            U
    metadata_persist_last_value_for_sequence  1               NULL
    lock_acquired                             NULL            SCH_S
    lock_acquired                             NULL            IX
    lock_acquired                             NULL            U
    metadata_persist_last_value_for_sequence  2               NULL
    lock_acquired                             NULL            SCH_S
    lock_acquired                             NULL            IX
    lock_acquired                             NULL            U
    metadata_persist_last_value_for_sequence  3               NULL
    

    Ao usar um cache de 4.

    name                                      persisted_value mode
    ----------------------------------------- --------------- -----
    lock_acquired                             NULL            SCH_S
    lock_acquired                             NULL            IX
    lock_acquired                             NULL            U
    metadata_persist_last_value_for_sequence  4               NULL
    lock_acquired                             NULL            SCH_S
    lock_acquired                             NULL            SCH_S
    lock_acquired                             NULL            SCH_S
    lock_acquired                             NULL            SCH_S
    lock_acquired                             NULL            IX
    lock_acquired                             NULL            U
    metadata_persist_last_value_for_sequence  8               NULL
    

    O SCH_Sbloqueio é feito quando um valor é necessário. E quando o cache está esgotado, é seguido por um IXe o Ubloqueio e, finalmente, o evento metadata_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.

    O tamanho do cache para o objeto de sequência 'dbo.S' foi definido como NO CACHE.

    Portanto, o SQL Server acha que não há diferença e me diz isso. No entanto, há uma diferença na sys.sequencescoluna cache_size. É NULL para nenhum cache e 1 para um cache de 1.

    • 24

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve