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 / 267728
Accepted
Kirk Saunders
Kirk Saunders
Asked: 2020-05-23 12:22:25 +0800 CST2020-05-23 12:22:25 +0800 CST 2020-05-23 12:22:25 +0800 CST

Armazenar VarChar(Max) [Notas] Coluna na Mesma ou Tabela Separada

  • 772

Isenção de responsabilidade

Eu tive uma ideia para um design de mesa há pouco tempo que fez sentido para mim na época. Na história recente, percebi que tenho o hábito de "engenharia em excesso" ou gastar muito tempo tentando "otimizar demais" as soluções. Estou assumindo que este é um daqueles casos em que estou pensando demais na solução e criarei uma sobrecarga extra com pouco ou nenhum ganho real.

Pergunta

Suponha que para um objeto (um Shipment tablepor exemplo) existe algum tipo de NOTE varchar(MAX)elemento de dados que queremos acompanhar. O NOTE columntem a oportunidade de ter dados empurrados para um estouro e aumentar drasticamente o tamanho do row(limitando assim o número rowsque pode ser salvo no page). Pelo que entendi, isso impacta negativamente no tempo de execução de várias operações na tabela como um todo.

Existe algum caso em que devemos empurrar isso columnpara um stand separado sozinho ShipmentNote tableem vez de mantê-lo como columnum Shipment table? A teoria é que, se empurrarmos o NOTE columnpara um separado table, ele salva o pageson the, o Shipment tableque permite que todas as operações no the Shipment tabletenham um desempenho melhor. Porque o rowtamanho é menor e agora você pode caber mais rowsno mesmo page.

(Veja exemplos de esquema abaixo):

Diagrama ER

O principal caso de uso em que isso pode ser uma boa ideia é se:

  • O Note columné regularmente mais de 8000 caracteres (o que eu acho que é quando começamos a usar a paginação extra)
  • O Note columnúnico retornado em SELECToperações e raramente ou nunca é usado como parte de um JOINouWHERE
  • O restante será consultado independentemente de columnsforma regular (IE: a maioria de nossas operações, não utilizará , seja isso ou condições acontecendo em outros em `Remessa)ShipmentNoteNoteJOINWHEREcolumns

As desvantagens que estou vendo (fora disso, podem não fazer melhorias perceptíveis no trabalho com a Shipmenttabela fora da Notecoluna):

  • Agora se torna impossível (ou pelo menos requer um triggerou outra coisa) garantir que sempre haja algum tipo de valor para NOTE(IE: porque agora está em um separado child table, não podemos garantir que NOTEseja NOT NULLpara todos rowemShipment
  • Qualquer operação utilizando NOTEagora exigirá um esforço extra, devido à necessidade de fazer um JOINpara garantir que estamos trabalhando com o registro correto
sql-server database-design
  • 2 2 respostas
  • 612 Views

2 respostas

  • Voted
  1. Best Answer
    World Wide DBA
    2020-05-23T13:37:41+08:002020-05-23T13:37:41+08:00

    Embora seja ótimo que você esteja pensando nisso - eu consideraria isso uma micro-otimização. O SQL Server já possui otimizações incorporadas para manipulação NVARCHAR(MAX)e, geralmente, eu diria para não adivinhar até que se torne um problema. No entanto, há dois pontos principais que vieram à mente ao ler sua pergunta.

    A primeira é (como você mencionou no último ponto) haveria realmente algum desempenho obtido ao dividir os dados em outra tabela, deixando o SQL Server otimizar as páginas e os dados em si? Não tenho provas concretas comigo agora, mas suspeito que não. A razão é que, como você mencionou, seus dados estão regularmente acima de 8.000 bytes e, portanto, serão movidos para páginas LOB em sua tabela de notas de qualquer maneira. Você estaria apenas movendo o problema percebido de uma mesa para outra. Adicione a sobrecarga de executar um JOINquando tiver que buscar os dados e você provavelmente acabará um pouco pior do que estava no início.

    Em segundo lugar, como você marcou a pergunta com design de banco de dados, minha recomendação real é que você divida as notas em outra tabela. No entanto, meu raciocínio não é tanto impulsionado pela otimização de desempenho, mas mais especificamente adicionando flexibilidade ao aplicativo. É muito provável que uma remessa precise de mais de uma nota anexada a ela (por exemplo, se estiver atrasada em trânsito, ou um cliente ligar etc...). Se você tiver a nota na própria remessa, fica mais difícil fazer isso sem duplicar os dados. Se você extraí-lo em sua própria tabela, poderá atribuir várias notas a uma remessa e rastrear quem as inseriu e quando. Isso torna seu aplicativo e banco de dados mais flexíveis.

    Se você deseja otimizar, recomendo remover a necessidade de consultar as notas, a menos que alguém queira visualizá-las especificamente (como ter um formulário dedicado em seu aplicativo para fazer isso). Dessa forma, você só precisa realizar a junção/pesquisa quando alguém explicitamente deseja visualizar os dados. Mesmo que você não tenha externalizado as notas para outra tabela, não incluir a coluna na consulta se não for necessária removerá a necessidade de o SQL Server ler a página LOB. Se possível, sempre otimizaria as consultas para retornar a menor quantidade de informações necessárias antes de otimizar em um nível micro.

    • 5
  2. David Browne - Microsoft
    2020-05-23T14:44:03+08:002020-05-23T14:44:03+08:00

    A resposta simples é não, a menos que você tenha um aplicativo que sempre busque todas as colunas da tabela e precise evitar que ele recupere as notas toda vez que consultar uma Remessa.

    Se você decidir, pode instruir o SQL Server a nunca armazenar as notas na linha e usar um ponteiro para um LOB separado com a opção de tabela 'tipos de valor grande fora da linha' e pode até enviar esses LOBs para um grupo de arquivos separado por definindo a opção TEXTIMAGE_ON em CREATE TABLE .

    • 4

relate perguntas

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

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

  • 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