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 / 11341
Accepted
JoeGeeky
JoeGeeky
Asked: 2012-01-23 08:09:02 +0800 CST2012-01-23 08:09:02 +0800 CST 2012-01-23 08:09:02 +0800 CST

Em qual tipo de dados armazenar dados XML: VARCHAR(MAX) ou XML

  • 772

Estou definindo um esquema para um novo conjunto de recursos usando o SQL Server 2008... Nesse caso, cada registro ( por exemplo, linha ) precisará armazenar fragmentos XML. De tempos em tempos; embora não com frequência; Vou precisar consultar o XML para encontrar valores de elementos e atributos. Se deixado por conta própria, eu tenderia a usar o tipo de dados XML , embora tenha sido levado a acreditar que isso é forjado com problemas. Então isso me leva às minhas perguntas.

Diante desse cenário, quais fatores devo considerar ao tentar decidir entre armazenar XML em uma coluna XML ou uma coluna varchar(MAX)

Se ajudar... aqui estão alguns detalhes adicionais:

  • Nenhuma decisão foi tomada em relação ao uso de esquemas para esses fragmentos ( por exemplo, XSD's )
  • Os tamanhos dos fragmentos variam de pequenos a muito grandes
  • Todo o XML será bem formado
  • Ao longo de um dia, haverá até ~ 10.000 fragmentos coletados com suporte de consulta on-line necessário por ~ 3 meses
  • As consultas ao XML acontecerão ao longo do dia, mas devem permanecer leves com poucas consultas simultâneas desse tipo
sql-server-2008 database-design
  • 3 3 respostas
  • 15586 Views

3 respostas

  • Voted
  1. Solomon Rutzky
    2016-03-27T11:29:25+08:002016-03-27T11:29:25+08:00

    quais fatores devo considerar ao tentar decidir entre armazenar XML em uma xmlcoluna ou em uma varchar(MAX)coluna

    Os fatores são:

    1. O XMLtipo pode ser consultado/analisado por meio de expressões XQuery, inclusive podendo usar instrução FLWOR e iteração

    2. Os dados em XMLvariáveis ​​e colunas podem ser modificados em linha usando expressões XQuery via XML DML .

    3. XMLos dados são armazenados como UTF-16 LE (Little Endian), portanto, VARCHAR(MAX)seria uma má escolha, pois poderia resultar em perda de dados. Portanto, a verdadeira decisão deve estar entre XMLe NVARCHAR(MAX), dado que NCHAR/ NVARCHARtambém é UTF-16 LE.

    4. XMLos dados podem ser validados em um arquivo XSD / XML SCHEMA COLLECTION. Nenhuma validação (além de garantir a boa formação) é feita se nenhuma Coleção de Esquema XML for especificada, mas esta opção não está disponível ao usar NVARCHAR(MAX).

    5. Um grande benefício do tipo XML é que ele é armazenado em um formato altamente otimizado (não VARBINARY(MAX)conforme declarado na resposta de @Oleg ) que não armazena a representação de string exata que você vê, mas em vez disso possui um dicionário de nomes de elementos e atributos e refere-se a eles por seu ID. Também remove espaços em branco. Tente o seguinte:

      DECLARE @Test1 XML = N'<Test><TagName>1</TagName><TagName>2</TagName></Test>';
      
      DECLARE @String1 NVARCHAR(MAX) = CONVERT(NVARCHAR(MAX), @Test1);
      
      SELECT DATALENGTH(@Test1) AS [XmlBytes],
             LEN(@String1) AS [StringCharacters],
             DATALENGTH(@String1) AS [StringBytes];
      
      SET @Test1 = N'<Test><TagName>1</TagName><TagName>2</TagName><TagName>3</TagName>
      <TagName>4</TagName><TagName>5</TagName><TagName>6</TagName></Test>';
      
      SET @String1 = CONVERT(NVARCHAR(MAX), @Test1);
      
      SELECT DATALENGTH(@Test1) AS [XmlBytes],
             LEN(@String1) AS [StringCharacters],
             DATALENGTH(@String1) AS [StringBytes];
      

      Retorna:

      XmlBytes   StringCharacters   StringBytes
      56         53                 106
      
      XmlBytes   StringCharacters   StringBytes
      84         133                266
      

      Como você pode ver no exemplo de saída acima, adicionar quatro elementos (#s 3, 4, 5 e 6) adicionou 80 caracteres (portanto, 80 bytes se estiver usando VARCHAR) e 160 bytes à NVARCHARvariável. No entanto, ele adicionou apenas 28 bytes à variável XML, que é menos do que foi adicionado VARCHAR(apenas no caso de alguém argumentar a favor de VARCHARmais XMLporque XMLé UTF-16, que é [principalmente] byte duplo). Essa otimização pode economizar muito espaço e é motivo suficiente por si só para usar o tipo de XMLdados.

    6. Os dados XML podem ser indexados por meio de índices XML especializados

    • 17
  2. Best Answer
    Oleg Dok
    2012-01-23T08:43:45+08:002012-01-23T08:43:45+08:00

    Se as consultas no XML ocorrerem pelos recursos xml do servidor SQL, use o tipo XML para armazenar um xml para evitar a conversão

    E

    tenha em mente que o tipo XML pode ser armazenado um pouco mais devagar devido à validação xml, mas o tipo subjacente de XML é varbinary(max) comum

    • 7
  3. user2864740
    2020-12-02T13:11:03+08:002020-12-02T13:11:03+08:00

    Um dos principais contribuintes para a diferença de armazenamento entre NVARCHAR(MAX) não discutido na resposta original é que NVARCHAR(MAX) não usa SCSU; usar pares de colunas NVARCHAR(N) + NVARCHAR(MAX) pode reduzir significativamente os requisitos de armazenamento, além da compactação de página mencionada abaixo. Consulte 'compressão' SCSU manual no SQL Server 2017 para NVARCHAR(MAX)

    —

    Uma consideração que não está presente nas outras respostas está relacionada à compactação de página. Com a compactação de página, existem alguns casos de uso muito específicos , nos quais o armazenamento de XML como NVARCHAR(MAX) pode ser benéfico, dependendo de alguns fatores específicos.

    Este é um cenário especial e só deve ser considerado após análise de dados e uso. No cenário apresentado, isso parece improvável.

    Considerações de quando alguém pode considerar NVARCHAR(MAX) sobre XML:

    • A compactação de página é usada . O terceiro nível é a compactação de dicionário.
    • Os fragmentos XML são pequenos (por exemplo, < 1/4 de caracteres de página) e contêm valores repetitivos suficientes e/ou possuem prefixos comuns que a compactação de página pode eliminar.
    • Os discos custam $$$ e uma das principais metas de negócios é reduzir o uso do disco em detrimento de outros recursos . (Não se preocupe se o espaço em disco for amplo!)
    • Os campos são salvos em Dados In-Row, pois os dados LOB não se beneficiam da Compactação de Página.
    • Na verdade , a compactação de página permite que mais linhas caibam em uma única página. (Não se preocupe se linhas adicionais não puderem ser combinadas em uma única página!)
    • As consultas XML nos campos são pouco frequentes, para evitar o custo de análise. Essa abordagem é mais eficaz para 'armazenamento a frio'.

    Algumas desvantagens e contra-argumentos:

    • Nenhuma validação nativa de XML no campo, digitado ou não.
    • Índices XML não podem ser usados.
    • Pague o custo da CPU em cada conversão do texto de volta para um tipo XML.
    • A eficiência da compactação de página sobre codificação XML varia com base na quantidade de duplicação em valores (incluindo nós de texto) em registros em uma única página.
    • A compactação de página não beneficiará grandes fragmentos XML movidos para LOB. Espera-se que a codificação XML resulte em menor uso de disco aqui. Pode-se dividir campos e usar COMPRESS para grandes dados XML, embora isso esteja adicionando outro nível de complexidade com preocupações adicionais.

    Em um cenário muito específico em que tenho trabalhado, o uso de NVARCHAR(MAX) resulta em mais de 20% de redução no uso de disco quando aplicado a muitos fragmentos pequenos com alta duplicação. YMMV. Teste com dados e usos reais.

    • 1

relate perguntas

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

  • Quais são algumas maneiras de implementar um relacionamento muitos-para-muitos em um data warehouse?

  • Quanto "Padding" coloco em meus índices?

  • Existe um processo do tipo "práticas recomendadas" para os desenvolvedores seguirem para alterações no banco de dados?

  • Downgrade do SQL Server 2008 para 2005

Sidebar

Stats

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

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 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

    Como selecionar a primeira linha de cada grupo?

    • 6 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
    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
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +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
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +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