como o nvarchar (max) armazena dados no banco de dados será rápido se alguns dados tiverem menos de 4000 caracteres?


8

Eu tenho que desenvolver um CMS que suporte dois idiomas em inglês, o árabe. Este CMS será uma espécie de site de Publicação de Artigo. Ao projetar e analisar, descobri que alguns artigos têm mais de 8000 caracteres. Minha tabela tem alguma coluna como

PageID int,
PageTitleEnglish nvarchar(200),
PageTitleArabic nvarchar(200),
PageDescEnglish nvarchar(500),
PageDescArabic nvarchar(500),
PageBodyEnglish nvarchar(max)
PageBodyArabic nvarchar(max)

Se eu mantiver PageBody como nvarchar (4000), então eu estou limitado a 4000 caracteres e se eu tiver que armazenar a versão em árabe, preciso de 16000 bytes (como o árabe é Unicode e ocupa 3 vezes mais espaço que o ASCII).

Então, eu só tenho a opção de definir PageBody como nVarchar (max) , isso terá o lado negativo do ponto de vista do desempenho. Minha pergunta real é se alguns dados na coluna PageBody têm menos de 4000 caracteres, será MS SQL Store do que dados na coluna embutida ou separadamente no banco de dados.

Também procurei isso no Google, mas não encontrei nenhuma resposta relevante e como posso melhorar o desempenho nesse cenário.

Quaisquer sugestões de melhores práticas para esse projeto de CMS multilíngue são bem-vindas.

Preciso suportar apenas dois idiomas Árabe e Inglês


Você sempre terá inglês e árabe? Ou talvez apenas um opcional? Se sim, será sempre obrigatório? Você espera mais idiomas depois?
gbn 30/12

Respostas:


9

Um nvarchar(max)valor será armazenado " em linha " se for curto o suficiente.

O comportamento padrão pode ser modificado usando a opção sp_tableoption , "tipos de valores grandes fora da linha". Eu não me incomodaria. O mecanismo de banco de dados gerenciará isso de forma eficiente por si só.

Quanto ao design, existem várias maneiras de fazer isso com base no seu modelo:

  • Você sempre terá inglês e árabe?
  • Pode-se ser opcional? Se sim, será sempre obrigatório?
  • Você espera mais idiomas depois?

1. Mesas separadas

Ou seja, você pode dividir os idiomas separados em tabelas diferentes.
Isso permite agrupamentos no nível da tabela, em vez de no nível da coluna

Permite permitir mais linhas por página e mais chances de armazenamento LOB em linha

PageParent

  • PageID int,
  • PageOtherInfo ...

PageEnglish (note que varchar pode estar OK aqui)

  • PageID int,
  • PageTitleEnglish varchar (200),
  • PageDescEnglish varchar (500),
  • PageBodyEnglish varchar (max)

PageArabic

  • PageID int,
  • PageTitleArabic nvarchar (200),
  • PageDescArabic nvarchar (500),
  • Nvarchar PageBodyArabic (max)

2. Linhas separadas

Ou tenha uma coluna languageID para suportar vários idiomas.
Isso tem a desvantagem de que o agrupamento será corrigido para todos os idiomas, o que significa má classificação / filtragem

PageParent

  • PageID int,
  • PageOtherInfo ..

Página

  • PageID int,
  • LanguageCode,
  • PageTitle nvarchar (200),
  • PageDesc nvarchar (500),
  • PageBody nvarchar (max)

4
  • O MS SQL Server tem um tamanho de página fixo de 8 KB.
  • Uma linha nunca é dividida em várias páginas, mas várias linhas podem compartilhar uma única página.
  • nvarchar (max) e outros dados de BLOB podem, no entanto, ser armazenados fora da linha / página.

Isso significa que, para que tudo se encaixe em uma linha, a soma de todos os tamanhos deve ser menor que 8K. Caso contrário, o SQL Server armazenará os BLOBs fora da linha / página.

As quantidades de dados são tão grandes que isso realmente causa um problema de desempenho?

Como outra opção, talvez você possa alterar sua estrutura de banco de dados para ter linhas separadas para páginas em inglês e árabe e incluir uma coluna de código de idioma. Então você não precisará ajustar o texto em inglês e o árabe na mesma linha, e isso também faria sentido ao buscar dados, pois provavelmente você não precisaria buscar inglês e árabe ao mesmo tempo.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.