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 / 152727
Accepted
Kahn
Kahn
Asked: 2016-10-20 02:02:35 +0800 CST2016-10-20 02:02:35 +0800 CST 2016-10-20 02:02:35 +0800 CST

SQL Server 2016: desempenho da tabela temporal versus gatilhos e CDC

  • 772

Parece ser bastante difícil encontrar comparações entre tabelas temporais com versão do sistema e as opções mais antigas, como gatilhos de banco de dados e CDC. No momento, não tenho tempo para escrever um teste estendido no SQL Server 2016, então pensei em perguntar sobre isso aqui.

Basicamente, a vantagem típica dos gatilhos é que eles são mais fáceis de gerenciar em ambientes autônomos e em cluster/alwaysOn, são sincronizados em tempo real e têm acesso aos dados da sessão, como o ID do usuário.

O CDC, por outro lado, embora exija um pouco mais de gerenciamento e seja assíncrono, é muito mais leve e, portanto, tem um desempenho muito melhor. Portanto, se houver alguma dúvida de que o gargalo causado pelos gatilhos pode se tornar um problema, o CDC será basicamente a solução superior. Em termos de requisitos de hardware, há um requisito de espaço extra insignificante pelo CDC devido ao uso de logs e tabelas de auditoria do CDC para rastrear as alterações.

A pergunta: como as tabelas temporais se comparam às duas anteriores? Em termos de velocidade, desempenho, uso de espaço de armazenamento. QUANDO devo usar tabelas temporais em vez de gatilhos ou CDC? Quando não devo?

Entendo que algo potencialmente complexo como os requisitos de negócios e as limitações técnicas por trás da auditoria de banco de dados não terá uma resposta fácil, pois depende muito dos requisitos e do escopo do projeto. Mas qualquer coisa para lançar mais luz sobre as questões acima seria apreciada. Obrigado!

(Observação, voltei a isso em 2021 e acrescentei o que havia aprendido como resposta à pergunta original. Você a encontrará abaixo.)

sql-server trigger
  • 2 2 respostas
  • 7901 Views

2 respostas

  • Voted
  1. Best Answer
    Andy Jones
    2016-10-20T02:31:42+08:002016-10-20T02:31:42+08:00

    Depende do seu caso de negócios. As tabelas temporais e a captura de dados alterados oferecem funcionalidades diferentes.

    As tabelas temporais são usadas para fornecer uma versão da sua tabela em um determinado momento. Um caso de uso pode ser uma dimensão que muda lentamente na qual você deseja rastrear as mudanças nos atributos da dimensão e relatá-las a qualquer momento.

    A captura de dados alterados pode ser usada em uma tabela OLTP para facilitar a exportação para um data mart. Ele registra todas as alterações em uma tabela separada, para que você possa visualizar facilmente as linhas alteradas desde o último ponto LSN de exportação.

    • 6
  2. Kahn
    2021-09-10T02:42:34+08:002021-09-10T02:42:34+08:00

    Como tem havido algum interesse contínuo nisso e anos depois eu me familiarizei muito bem com tudo o que foi dito acima, aqui está um breve resumo em termos de desempenho: Fiz um teste em alguma versão do SQL Server 2016 envolvendo inserção, atualização e exclusão 10.000 linhas de 40 tipos diferentes de tabelas, uma a uma, e mapeou o tempo total gasto, informações básicas de bloqueio etc. sobre cada uma. O resumo simples é que onde os gatilhos adicionaram em média 500-1000% mais atraso às operações, com tabelas temporais e CDC foi mais próximo de 10% de atraso extra por operação. Ajudaria se eu tivesse os resultados exatos, mas não me lembro mais deles. O processo de gatilho foi muito simplificado, mas inseriu uma linha por coluna alterada, em vez de temporal / cdc, que inseriu uma linha, independentemente de quantas colunas nela foram alteradas. Neste sentido, algumas alterações podem ter feito os gatilhos parecerem mais lentos do que eram, devido à contenção de chave de várias linhas sendo inseridas ao mesmo tempo. No entanto, era óbvio que os gatilhos eram a ferramenta menos adequada para auditoria simples. Então, aqui está um resumo técnico simples das diferenças que eu estava tentando entender quando criei este post:

    Os gatilhos só são bons se você realmente precisar de alguma lógica personalizada incorporada ao banco de dados, para observar as alterações DML, modificar dados específicos, capturar o ID do usuário em instâncias específicas, etc. Mas tente evitá-los como a praga. Eles são horríveis para o desempenho. E se você precisar de auditoria ou registro, eles são o último lugar que você deve procurar.

    Tabelas temporais são muito fáceis de gerenciar quando você as executa, especialmente em HADR como Always On. Como eles suportam compactação e refletem a maioria das alterações de esquema do pai para a tabela de histórico, eles exigem muito pouca manutenção. Especialmente com novas versões do SQL Server, você pode definir o período de retenção para remover dados com mais de x anos de qualquer maneira, de modo que as considerações de armazenamento e limpeza também sejam insignificantes. Eles são tão disparados e esquecidos quanto as coisas acontecem, exceto algumas atualizações exóticas nas tabelas pai, nas quais você precisa alterar os dados; nesse caso, é necessário desvincular, modificar a tabela pai e o histórico e vinculá-los novamente. Mas estes são raros e relativamente fáceis de fazer. O pacote de tabela temporal é robusto e lida bem com erros, então você achará difícil quebrá-lo acidentalmente.

    O CDC pode ser ótimo para serviços de relatórios ou cenários semelhantes em que você não se importa com dados assíncronos, mas precisa analisar alterações, por exemplo, em lotes noturnos. Você pode definir a configuração de retenção para manter apenas x dias de dados para manter os custos de armazenamento no mínimo. Dito isto, o CDC é, pela minha experiência, meticuloso e não muito estável. Os DMLs podem "quebrá-lo" às vezes sem aviso, portanto, você pode precisar de gatilhos DDL no nível do banco de dados para avisá-lo sobre alterações nos objetos rastreados pelo CDC. Você também pode precisar definir watchjobs customizados para HADR, pois ele não lida nativamente com eventos de failover. E o CDC tem uma propensão muito desagradável para não reiniciar depois de ser desativado, algo sobre o estado dele não ser atualizado corretamente usando os próprios trabalhos do MS. Isso significa que ocasionalmente será necessário trabalho manual para garantir que os trabalhos de limpeza e captura e suas referências sejam removidos corretamente. Dito isso, o SSIS/RS se integra muito bem e facilita o uso do CDC para eles.

    • 3

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