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 / 331294
Accepted
Mattia Durli
Mattia Durli
Asked: 2023-09-18 06:01:00 +0800 CST2023-09-18 06:01:00 +0800 CST 2023-09-18 06:01:00 +0800 CST

Faz sentido ter o banco de dados operacional e o banco de dados analítico no mesmo SQLServer?

  • 772
Esta questão foi migrada do Stack Overflow porque pode ser respondida no Stack Exchange dos Administradores de Banco de Dados. Migrado há 2 dias .

Digamos que eu tenha uma única tabela que armazena informações de rastreamento de dispositivos móveis (cada registro possui deviceID, informações de transação, uma coluna json com detalhes completos sobre a operação, tempo de operação, usuário, etc...), este é o banco de dados operacional . Alguns usuários podem precisar obter informações de rastreamento de um intervalo de tempo, sobre um determinado usuário ou dispositivo. Portanto, uma simples seleção com filtros não afetará a inserção de dados.

Alguns outros usuários precisarão realizar operações analíticas maiores, agregações ao longo de meses de dados coletados. Li que esse processo de análise deveria ser feito em um banco de dados analítico, para não impactar o banco de dados operacional.

Mas tenho um limite, apenas uma instância do SQLServer disponível.

Então eu deveria escrever um ETL que faça uma cópia periódica em lote dos dados em um novo banco de dados, com a mesma tabela única com mais alguns índices e sem a coluna json (para economizar espaço, porque para o tipo de análise que precisamos é inútil)

Agora minha pergunta é, dado que estamos falando de uma tabela operacional e uma tabela de análise (mais do que um banco de dados operacional e um banco de análise), e nas instalações do meu cliente terei apenas uma única instância do SQLServer, faz sentido manter ambas as tabelas dentro do mesmo banco de dados na mesma instância do SQLServer? Melhorei o desempenho ao usar uma única tabela para consultas operacionais e analíticas? Dizendo de outra forma, tenho duas opções, usando uma instância do SQLServer:

  1. inserir dados em uma tabela com todos os índices necessários e consultar essa tabela para rastreamento E para análise
  2. insira dados em uma tabela com poucos índices e copie-os para outra tabela com mais índices e um tamanho geral reduzido e consulte a primeira para rastreamento e a segunda para análise

Se você me disser que se eu colocar tudo no mesmo SQLServer, 1 e 2 não serão muito diferentes em termos de performance, vou ficar com 1 porque é mais fácil.

Se eu fizer agregações de alguns minutos na tabela analítica, a escrita na tabela operacional ficará menos lenta ou o mesmo acontecerá com a análise diretamente na tabela operacional?

Obrigado

sql-server
  • 1 1 respostas
  • 71 Views

1 respostas

  • Voted
  1. Best Answer
    J.D.
    2023-09-18T09:56:26+08:002023-09-18T09:56:26+08:00

    Dizendo de outra forma, tenho duas opções, usando uma instância do SQLServer:

    1. inserir dados em uma tabela com todos os índices necessários e consultar essa tabela para rastreamento E para análise
    2. insira dados em uma tabela com poucos índices e copie-os para outra tabela com mais índices e um tamanho geral reduzido e consulte a primeira para rastreamento e a segunda para análise

    Conforme já mencionado nos comentários, a resposta sobre qual implementação teria melhor desempenho para você dependerá dos casos de uso específicos e da proporção de leitura para gravação da tabela em seu banco de dados, bem como da contenção geral geral de recursos.

    opção 2

    Se houver muitas leituras e gravações simultâneas na tabela, será possível que elas bloqueiem e bloqueiem umas às outras (com o nível de isolamento padrão no SQL Server). Ter uma segunda instância da tabela que dissocie (se possível) a sobreposição de casos de uso de leitura e gravação pode melhorar o desempenho em relação ao bloqueio, nesse cenário. Normalmente, é bom isolar a segunda instância em um servidor separado para dissociar também a contenção de recursos, mas, como você observou, isso não é possível no seu caso.

    Mas escrever os mesmos dados duas vezes não é gratuito. E, novamente, estar no mesmo servidor utilizará o dobro dos recursos que você usaria anteriormente se você mantivesse as coisas em uma única tabela. E para maximizar o benefício de dissociar os casos de uso de leitura e gravação, você provavelmente desejaria gravar os dados em lotes, em um momento diferente do momento em que ocorrem os casos de uso de leitura. Isso deixaria sua cópia da tabela obsoleta, em vez de estar sincronizada em tempo real com a tabela original. Há também manutenção extra para manter a estrutura da tabela sincronizada à medida que ocorrem alterações no esquema no original. Não é uma tarefa simples.

    Opção 1

    Por outro lado, se você não tiver muitas leituras e gravações simultâneas, ou se houver muita simultaneidade, mas não muita consulta e contenção de recursos em geral, então uma única instância da tabela, indexada adequadamente para a maior parte de seus principais casos de uso, pode funcionar perfeitamente. O tempo de bloqueio pode variar de milissegundos a nanossegundos, imensurável no que diz respeito à sua aplicação.

    Opção 0

    Além de tudo isso, uma terceira opção alternativa é alterar o nível de isolamento do banco de dados para algo mais propício à simultaneidade otimista. No SQL Server, as opções para isso são Read Committed Snapshot Isolation (RCSI) e apenas Snapshot Isolation . Resumindo, a simultaneidade otimista geralmente permite que consultas de leitura e gravação operem na mesma tabela simultaneamente, sem bloquear uma à outra. Os leitores não bloqueiam os escritores e os escritores não bloqueiam os leitores. (Os gravadores ainda bloquearão outros gravadores.) Isso funciona porque um armazenamento de versão mantém cada versão de um registro em alteração ativa na tabela. Quando uma consulta de gravação está fazendo uma alteração em uma linha, sua versão anterior fica disponível para leitura até que a alteração de gravação seja confirmada e o bloqueio nela seja liberado.

    Ambas as opções para níveis de isolamento de simultaneidade otimista têm diferentes prós e contras (conforme discutido nos artigos vinculados), mas eu prefiro o RCSI, que permite globalmente a simultaneidade otimista no servidor. Isso é semelhante ao modo como o Banco de Dados SQL do Azure e alguns outros sistemas de banco de dados modernos funcionam imediatamente. E ativá-lo é essencialmente ativar uma propriedade do banco de dados com uma única linha de código.

    • 1

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