Para alguém que conhece informações internas do banco de dados, essa pode ser uma pergunta fácil, mas alguém pode explicar de maneira clara por que o armazenamento de grandes blobs (digamos, filmes de 400 MB) no banco de dados deve diminuir o desempenho e o que exatamente isso significa? Essa é uma afirmação frequentemente encontrada na Internet, mas nunca a vi realmente explicada.
Para ser específico, estou me referindo ao desempenho do SharePoint / MSSQL, ou seja, desempenho de upload de arquivos, navegação no site, listas de exibição, abertura de documentos etc. - operações que se dizem mais lentas quando o banco de dados fica muito grande. A externalização de blob para o sistema de arquivos (que no SharePoint é chamada de Armazenamento Remoto de Blob, também conhecido como mover arquivos para fora do banco de dados, deixando apenas uma referência) deve resolver isso até certo ponto, mas qual exatamente - no nível inferior - é a diferença? É óbvio que os backups demorariam mais tempo com arquivos gigantes armazenados no banco de dados ... mas quais operações são impactadas exatamente e qual é o mecanismo subjacente (ou seja, de que maneira os arquivos armazenados no sistema de arquivos fora do banco de dados são acessados ou armazenados de maneira diferente)?
Suponha que uma tabela simples contenha colunas ID(guid, PK), FileName(string), Data(varbinary(max))
- a Data
coluna grande realmente diminuiria as operações, como exibir uma lista de arquivos em um site (que eu suponho internamente significa execução SELECT FileName FROM table
) ou inserir uma nova linha? Não é como se as colunas binárias reais fossem indexadas.
Sei que já foram feitas algumas perguntas como essa, mas não encontrei uma explicação adequada.
Respostas:
Isso realmente depende do sistema do banco de dados, mas uma coisa importante a ser considerada nos BLOBs é o processamento de transações. Pela externalização para o sistema de arquivos, é feita uma alteração nos dados binários das transações. Isso normalmente resultará em operações de gravação mais rápidas , em oposição à situação em que o banco de dados garante a conformidade do ACID com mecanismos de reversão completos etc.
Hipoteticamente, operações de leitura mais lenta também podem ocorrer, quando você recupera dados do seu banco de dados de uma tabela BLOB sem selecionar os dados BLOB, pois o banco de dados pode armazenar as linhas restantes mais localizadas no disco, o que permitirá um acesso de leitura mais rápido (mas acho que a maioria os sistemas de banco de dados modernos são inteligentes o suficiente para armazenar os dados binários reais em uma área de disco ou espaço de tabela separado; portanto, sem testar isso em um cenário do mundo real, não se deve fazer suposições gerais aqui).
fonte
Geralmente, é um problema de largura de banda. Se você estiver exibindo centenas de vídeos por hora, estará amarrando a largura de banda dentro e fora do banco de dados, principalmente copiando buffers. Também é um problema se você tiver consultas ingênuas (possivelmente geradas automaticamente por uma ferramenta ORM) que simplesmente selecionam todas as colunas de uma tabela. Você também está sujeito à fragmentação de arquivos como um sistema de arquivos (exceto neste caso, é uma fragmentação de registros), mas (geralmente) sem ferramentas para des fragmentar. Se você também estiver modificando o BLOB (por exemplo, está suportando algum tipo de edição de vídeo), o banco de dados copiará o BLOB inteiro para o segmento de reversão ou refazer e, em seguida, gravará o BLOB atualizado no banco de dados. Então agora você está copiando essas centenas de megabytes,
fonte
Você pode querer examinar o SQL Server FileTables . A idéia é fornecer o melhor dos dois mundos: acesso e desempenho no nível do sistema de arquivos, além de acesso ao banco de dados e segurança e serviços integrados. O banco de dados tem uma sobrecarga de desempenho em alguns casos. Basta comparar um arquivo HTML codificado em um servidor da Web com um que precisa buscar o conteúdo de um banco de dados.
Imagine que um aplicativo que não considerava o armazenamento de blobs no banco de dados era um limite significativo para o desempenho, mas o aplicativo cresceu até o ponto em que estava. Há menos alterações de codificação usando o FileTables. Além disso, você pode gerenciar a transação no nível do banco de dados e do arquivo sem muita codificação. O arquivo e os metadados estão disponíveis no SQL.
No Windows Server, uma unidade de compartilhamento é criada para acessar os arquivos sem usar a sobrecarga de transação do banco de dados.
É um problema comum que a Microsoft tentou lidar "pronto para uso" com o SQL Server 2012. Não é um recurso ruim para justificar uma atualização.
fonte
Para saber por que isso é feio, você precisa saber como um banco de dados é salvo no disco rígido (especificamente linhas). O conteúdo físico de uma linha salva no disco é dividido em seus equivalentes estáticos e dinâmicos. Campos como int, byte, char (n) com comprimento fixo são listados primeiro. O que se segue é um número de comprimento fixo que se refere ao número de campos de comprimento variável a seguir. Todos os campos variáveis (independentemente da ordem das colunas apresentadas a você, o programador) são adicionados no final, cada um com um número de comprimento fixo, que determina quanto espaço o campo de comprimento variável ocupa.
Para dar um exemplo concreto. Suponha que minha tabela seja a seguinte:
Agora suponha que sim
INSERT INTO mytable (A, B, C) VALUES ('AAA', 'B', 256)
. No banco de dados, essa linha provavelmente seria armazenada da seguinte maneira:O campo A é salvo conforme o esperado. Se eu tivesse inserido 'A', ele forneceria um caractere especial para marcar o final prematuro da sequência após o primeiro caractere, mas ocuparia o mesmo espaço.
O campo C é salvo como o equivalente binário de 256. Por que C e não B? C é o próximo campo estático com comprimento fixo e, como tal, é agrupado com todos os outros dados estáticos na linha do banco de dados.
O campo D é uma meta-informação para o banco de dados, que indica que na seção de campos de comprimento variável a seguir, haverá precisamente 1 campo.
O campo E é novamente uma meta-informação para o banco de dados, que indica que, para esse campo em particular, tem no máximo 1 caractere. Essas informações são essenciais porque, caso contrário, o banco de dados não saberia onde o campo B termina e outro campo de comprimento variável começa.
Tudo isso para demonstrar como os bancos de dados lidam com o salvamento de campos de tamanho variável. BLOB é um campo de tamanho variável para esse efeito. A estrutura do banco de dados permite que uma linha contenha valores pequenos e grandes no BLOB, no entanto, existem outros fatores em jogo aqui. Os bancos de dados normalmente lidam com pedaços de informações, pois os discos não se importam com o conteúdo, mas se eles se encaixam em um único pedaço.
O banco de dados tentará ajustar o número de linhas em um único pedaço sem precisar separar uma linha em duas partes, porque, caso contrário, o efeito é o mesmo que ter um arquivo fragmentado no disco rígido. Depois que um pedaço é carregado, se a linha ultrapassar esse pedaço específico, o disco rígido deve procurar o restante em outro pedaço. Pior ainda, não há como um banco de dados saber que uma linha ocupa mais de um pedaço sem ler completamente seu conteúdo, uma vez que é de tamanho variável; portanto, não é possível otimizar buscando os dois pedaços de uma só vez.
Seguindo essa linha de lógica, se você pudesse criar um BLOB de comprimento estático, não teria esse problema de otimização, pois o banco de dados poderia simplesmente garantir que o tamanho do pedaço fosse maior que o tamanho mínimo da linha, garantindo assim que a maioria das linhas não precisa ser dividido em vários pedaços. Obviamente, os bancos de dados não fazem isso porque significariam dedicar um espaço precioso quando você provavelmente não precisará dele.
BLOBS são bons quando você está lidando com quantidades relativamente pequenas, mas para arquivos grandes, como vídeos e similares, uma solução comum é simplesmente salvar o caminho do arquivo no banco de dados e deixar o software lidar com o carregamento do arquivo, quase sempre mais eficiente.
Espero que isso explique. :)
fonte