How large are these images, and how many do you expect to have? While I mostly agree with @sp_BlitzErik, I think there are some scenarios where it is ok to do this, and so it would help to have a clearer picture of what is actually being requested here.
Algumas opções a considerar que aliviam a maioria dos aspectos negativos apontados por Erik são:
Essas duas opções foram projetadas para serem um meio termo entre o armazenamento de BLOBs totalmente no SQL Server ou totalmente fora (exceto por um colun de seqüência de caracteres para manter o caminho). Eles permitem que os BLOBs façam parte do modelo de dados e participem das Transações sem desperdiçar espaço no buffer pool (ou seja, memória). Os dados do BLOB ainda estão incluídos nos backups, o que os faz ocupar mais espaço e levar mais tempo para fazer backup erestaurar. No entanto, tenho dificuldade em ver isso como um verdadeiro negativo, pois se ele faz parte do aplicativo, é necessário fazer backup de alguma forma, e ter apenas uma coluna de string contendo o caminho é completamente desconectado e permite que os arquivos BLOBs sejam recebidos. excluído sem indicação do que no DB (isto é, ponteiros inválidos / arquivos ausentes). Ele também permite que os arquivos sejam "excluídos" dentro do banco de dados, mas ainda existem no sistema de arquivos que precisará ser limpo (por exemplo, dor de cabeça). Mas, se os arquivos forem ENORMES, talvez seja melhor deixar completamente fora do SQL Server, exceto a coluna do caminho.
Isso ajuda com a pergunta "dentro ou fora", mas não toca na única tabela versus a questão da tabela múltipla. Posso dizer que, além dessa pergunta específica, certamente existem casos válidos para dividir tabelas em grupos de colunas com base nos padrões de uso. Frequentemente, quando se tem 50 ou mais colunas, há algumas que são acessadas com frequência e outras que não. Algumas colunas são gravadas com frequência, enquanto outras são lidas principalmente. Separar colunas de acesso frequente e acessado com pouca frequência em várias tabelas com um relacionamento de 1: 1 costuma ser benéfico, porque por que desperdiçar o espaço no Buffer Pool para dados que você provavelmente não está usando (semelhante ao por que armazenar imagens grandes regularmenteVARBINARY(MAX)
colunas é um problema)? Você também aumenta o desempenho das colunas de acesso frequente, reduzindo o tamanho da linha e, portanto, ajustando mais linhas em uma página de dados, tornando as leituras (físicas e lógicas) mais eficientes. Obviamente, você também apresenta alguma ineficiência ao precisar duplicar a PK, e agora às vezes precisa juntar as duas tabelas, o que também complica (mesmo que apenas um pouco) algumas consultas.
Portanto, existem várias abordagens que você pode adotar e o melhor depende do seu ambiente e do que você está tentando realizar.
Fiquei com a impressão de que o SQL Server armazena apenas um ponteiro para alguma estrutura de dados BLOB dedicada na tabela
Não tão simples. Você pode encontrar algumas informações boas aqui: Qual é o tamanho do ponteiro LOB para tipos (MAX) como Varchar, Varbinary, Etc? , mas o básico é:
TEXT
, NTEXT
, E IMAGE
tipos de dados (por padrão): ponteiro de 16 bytes
VARCHAR(MAX)
, NVARCHAR(MAX)
, VARBINARY(MAX)
(Por padrão):
- Se os dados puderem caber na linha, eles serão colocados lá
- Se os dados forem inferiores a aprox. 40.000 bytes (a postagem do blog vinculado mostra 40.000 como o limite superior, mas meus testes mostraram um valor um pouco mais alto) E se houver espaço na linha para essa estrutura, haverá entre 1 e 5 links diretos para as páginas LOB, começando em 24 bytes para o primeiro link para os primeiros 8000 bytes e aumentando 12 bytes por cada link adicional para cada conjunto adicional de 8000 bytes, com no máximo 72 bytes.
- Se os dados ultrapassarem aprox. 40.000 bytes OU não há espaço suficiente para armazenar o número apropriado de links diretos (por exemplo, apenas 40 bytes restantes na linha e um valor de 20.000 bytes precisa de 3 links, que são 24 bytes para o primeiro mais 12 para os dois links adicionais para 48 bytes espaço total necessário em linha), haverá apenas um ponteiro de 24 bytes para uma página da árvore de texto que contém os links para as páginas LOB).