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 / 343106
Accepted
J. Mini
J. Mini
Asked: 2024-10-20 07:34:23 +0800 CST2024-10-20 07:34:23 +0800 CST 2024-10-20 07:34:23 +0800 CST

Considerando que exigem bloqueios de modificação de esquema, por que colunas esparsas são consideradas uma alternativa ao EAV?

  • 772

Pro SQL Server Relational Database Design and Implementation: Best Practices for Scalability and Performance é uma fonte muito confiável de boas ideias de design de banco de dados. Como alternativa ao Entity-Attribute-Value, ele sugere usar SQL dinâmico para permitir que seus usuários adicionem novas colunas esparsas a uma tabela.

Para mim, essa ideia fede. Adicionar novas colunas requer um bloqueio de modificação de esquema. Esse é um bloqueio muito sério e eu preferiria que meus usuários não tivessem a capacidade de obtê-lo.

Existe alguma propriedade de colunas esparsas que faz com que permitir que os usuários assumam um bloqueio tão sério não seja tão terrível quanto seria para outros tipos de coluna?

sql-server
  • 2 2 respostas
  • 70 Views

2 respostas

  • Voted
  1. Best Answer
    Charlieface
    2024-10-21T06:46:47+08:002024-10-21T06:46:47+08:00

    Embora louvável, sua preocupação em adicionar e remover colunas é, em grande parte, equivocada.

    Adicionar uma coluna anulável é uma operação somente de metadados: ou seja, ela só envolve pequenas alterações na definição da tabela do banco de dados em tabelas internas e não requer a reescrita dos índices clusterizados e todos os índices não clusterizados. Isso significa que tal modificação é muito rápida. Da mesma forma, remover uma coluna também é somente de metadados, pois o mecanismo de armazenamento simplesmente ignorará esses dados até que cada página seja eventualmente substituída sem eles.

    Você pode ver isso em ação neste violino . SET STATISTICS IO ONé usado para mostrar leituras da própria tabela, e você pode ver que isso só acontece na adição de uma coluna não anulável.


    Suas únicas preocupações reais devem ser:

    • Possíveis cadeias de bloqueio.
      Por exemplo, uma longa execução SELECTmantém um Sch-Sbloqueio na tabela. O ALTERtenta pegar um Sch-Mbloqueio e espera. Todas as outras SELECTconsultas de modificação então se acumulam atrás dele, esperando por seu próprio Sch-Sbloqueio que eles podem pegar.
      Infelizmente, isso não pode ser evitado usando WAIT_AT_LOW_PRIORITY, pois isso ainda não foi implementado para esse tipo de ALTER. Sua melhor aposta é colocar o seguinte antes do seu ALTER:
      SET LOCK_TIMEOUT 10000;  -- milliseconds
      
    • Todas as visualizações e procedimentos que acessam esta tabela precisarão que seus metadados sejam atualizados. Você pode usar o seguinte script, que obtém todos esses objetos e os atualiza:
    DECLARE @sql nvarchar(max) = (
        SELECT STRING_AGG(N'
    EXEC sp_refreshsqlmodule N''' + QUOTENAME(s.name) + '.' + QUOTENAME(o.name) + ''';',
          '')
        FROM sys.objects o
        JOIN sys.schemas s ON s.schema_id = o.schema_id
        WHERE o.object_id IN (
            SELECT ed.referencing_id
            FROM sys.sql_expression_dependencies ed
            WHERE ed.referenced_id = OBJECT_ID(@yourTable)
        )
          AND o.type IN ('P', 'V', 'FN', 'IF', 'TF', 'TR')
    );
    
    PRINT @sql;
    
    EXEC sp_executesql @sql;
    
    • 2
  2. J.D.
    2024-10-20T09:11:00+08:002024-10-20T09:11:00+08:00

    Para mim, essa ideia fede. Adicionar novas colunas requer um bloqueio de modificação de esquema. Esse é um bloqueio muito sério e eu preferiria que meus usuários não tivessem a capacidade de obtê-lo.

    Por que não? (Claro que posso listar um monte de razões teóricas, mas...) Independentemente se seus usuários fizerem uma alteração de esquema ou se você, como desenvolvedor, fizer essas mesmas alterações, um bloqueio de modificação de esquema será necessário. A maioria dos casos de uso em que os usuários finais têm esse acesso estão em um mundo limitado, onde eles estariam apenas atirando em si mesmos ou em sua equipe no pé. Em um ambiente multilocatário, não deve haver cruzamento, e os locatários devem ser separados de qualquer maneira.

    Outras medidas de design de aplicativos podem ser implementadas para minimizar os danos causados ​​pelos usuários finais que também se dão socos no rosto, como execução atrasada das alterações de esquema (por exemplo, uma fila agendada para executar o SQL gerado fora do horário comercial) e limitar o acesso a essa capacidade para usuários privilegiados de administrador do aplicativo.

    Existe alguma propriedade de colunas esparsas que faz com que permitir que os usuários assumam um bloqueio tão sério não seja tão terrível quanto seria para outros tipos de coluna?

    Novamente, não acredito nisso, e a solução deve ser uma solução arquitetônica. Além do que mencionei acima, outras escolhas de design que podem mitigar o risco disso são ter uma quantidade predefinida de colunas de vários tipos de dados que são mapeadas individualmente quando o usuário final precisa de uma coluna personalizada, ou ter uma tabela separada, por exemplo, ObjectNameExtendedonde novas colunas são adicionadas dinamicamente pelos usuários para que o bloqueio de modificação do esquema afete apenas as personalizações e não o aplicativo nativo, pelo menos.


    Além disso, como Erik Darling apontou, as colunas esparsas têm um conjunto de limitações que podem ser bem ruins, como impedir que você compacte quaisquer tabelas/índices dos quais elas fazem parte:

    Colunas esparsas são incompatíveis com a compactação de dados. Portanto, colunas esparsas não podem ser adicionadas a tabelas compactadas, nem tabelas contendo colunas esparsas podem ser compactadas.

    Além disso, de um anúncio de manutenção nesta rede:

    O recurso de colunas esparsas nos impede de adicionar novas colunas não nulas com um valor padrão como uma alteração on-line, somente de metadados.

    • 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