Eu tenho um banco de dados que é usado para armazenar impressões digitais. Na minha concepção, este deveria ser um banco de dados pequeno, mas o problema é que o desenvolvedor original provavelmente estava tropeçando no peiote e decidiu que seria uma ótima ideia armazenar as impressões digitais em campos BLOB.
Graças a esse truque de mágica, o banco de dados agora tem 3 GB de tamanho e o front-end está travando o tempo todo, não é de admirar, já que um simples SELECT TOP (1000) leva cerca de um minuto do MSSMS.
Então fico com uma dúvida de como proceder. Existe uma maneira de reduzir o tamanho da tabela que contém as fotos? Ou talvez outra alternativa para essa loucura.
Cumprimentos.
3GB não é realmente um monte de dados. Meu laptop tem 16 GB de memória, nosso datawarehouse é de 3 TB e seria um warehouse bastante pequeno. O tamanho máximo do banco de dados de acordo com aqui é 524.272 TB!? Portanto, acho que o desempenho aqui é mais sobre o kit em que você está, além do design de índice e consulta.
Você poderia refatorar como Russell sugeriu. No entanto, você também pode manter o design original de uma tabela com indexação apropriada, seja um índice de cobertura não clusterizado ou mesmo indexação de texto completo para oferecer suporte às consultas do tipo 'pesquisa de registro' - isso não deve incluir o blob. Em seguida, obtenha apenas as imagens de impressões digitais de forma individual, quando solicitado pelo aplicativo. Em outras palavras, não inclua a coluna blob
SELECTs
onde ela não for explicitamente necessária. Isso terá o mesmo efeito que dividir os dados em duas tabelas sem redesenhar. Não tente obter todas as impressões digitais de uma só vez!Informe-nos mais sobre a especificação do kit em que você está, a versão do SQL Server em execução, a tabela DDL (incluindo índices) e o tipo de consulta que o aplicativo normalmente executa.
Existem algumas abordagens para lidar com esse problema. Aqui estão três opções:
Crie uma
FingerprintBLOB
tabela (talvez em um banco de dados diferente) para os BLOBs de impressões digitais e remova essa coluna do arquivoOriginalTable
. Dessa forma quando vocêSELECT TOP(1000) * FROM OriginalTable
não precisar ler os BLOBs daFingerprintBLOB
tabela. Isso deve reduzir bastante os requisitos de E/S.Se você deseja gerenciar todo o armazenamento do SQL Server, essa seria a escolha a ser feita. Ele mantém as impressões digitais no banco de dados, mas separa as questões de I/O para consultas gerais.
Armazene cada FingerprintBLOB como um arquivo separado em uma estrutura de diretório no disco. Mantenha os BLOBs no
\\Server\Share\Path\Filename
arquivoOriginalTable
.Se você deseja manter o espaço do banco de dados menor e prefere armazenar no sistema de arquivos, escolha esta abordagem. Você pode implementar isso por conta própria, o que significa que precisará gerenciar os dois backups separados: banco de dados e estrutura de arquivos.
Ou, uma opção híbrida é que você pode usar o SQL Server
FILESTREAM
, que pode ser usado para gravar arquivos em discos que não sejam de banco de dados, mas ainda fornecer um único processo de BACKUP e RESTORE do SQL Server que faça backup de ambos os tipos de dados.Qualquer abordagem seria melhor realizada criando novas tabelas ou uma tabela e estruturas de arquivo. Em seguida, migre os dados para os locais apropriados. Depois de migrar os dados, você pode ajustar os nomes dos objetos, se desejar.