Por que eu devo ler este artigo:Quando se trata da utilização de banco de dados, há diversos aspectos que devem ser levados em consideração desde sua concepção como um projeto lógico até sua aplicação. Entre esses aspectos, a performance e segurança tem um grande destaque, pois tratam da segurança das informações armazenadas e quão rápido será para acessá-las. Este artigo traz uma abordagem prática, contextualizando problemas de performance e segurança, abordando soluções cotidianas que visam resolver os principais problemas durante a configuração do banco de dados.
O PostgreSQL está entre os bancos de dados relacionais mais utilizados, servindo desde aplicações web, comerciais e até mesmo aplicações mobile. Neste contexto, a segurança de um banco de dados vai além de cadastrar usuários e senhas, permitindo-lhes acessar determinadas áreas do sistema. Garantir a segurança de um banco de dados é prover uma arquitetura que encapsule os dados de tal maneira que seja garantido o armazenamento sólido e seguro das informações organizacionais. Além disso, de nada adiantaria as informações estarem bem armazenadas e seguras se não puderem ser recuperadas em tempo hábil pelos usuários, tornando-se assim indispensável um planejamento para se obter operações de alta performance em banco de dados.
Com a importância de se manter a segurança e performance no PostgreSQL , assim como demonstrar um novo recurso que permite a realização de UPSERT nativo, este artigo utiliza uma base de dados simulando um cenário real na qual serão aplicadas configurações visando melhorar o funcionamento do banco.
Cenário de dados
Na década de 90 e até mesmo nos anos 2000, as vídeo locadoras fizeram muito sucesso, por isto esse foi o objetivo de investimento de nosso cliente. No entanto, com o aumento da velocidade de conexão e com as tecnologias ascendentes da WEB 2.0, o segmento de vídeo locadora praticamente se extinguiu, fazendo nosso cliente migrar a operação de vídeo locadora para a web, ofertando o serviço de streamming.
O modelo de dados utilizado é similar ao Sakilla, a tradicional base de dados utilizada para ensino. A versão para download do banco Pagila (versão para PostgreSQL) está disponível no site do PgFoundry, sendo o modelo de dados ilustrado na Figura 1.
A grande questão é que com a migração para o modelo em nuvem, o cliente tem recebido de seus usuários muitas reclamações sobre lentidão no sistema e ele mesmo tem tido dificuldade de utilizar seu sistema, além de estar relatando a perda de informações armazenadas, coisas que não ocorriam quando utilizava apenas um sistema em modo local.
Neste cenário, nossa primeira ação será a verificação dos processos em batch realizados e, para tentar resolver o problema, será utilizada a função UPSERT, descrita na próxima seção.
UPSERT: Um comando que integra operações e melhora a performance
O comando UPSERT, em alguns SGBDs denominado de MERGE, tem como um objetivo realizar operações das duas funções que dão origem ao seu nome: UPDATE + INSERT = UPSERT. A essência do comando UPSERT é realmente mesclar os dois comandos que lhe dão origem, ele irá inserir um novo registro ou atualizá-lo, baseando-se em um parâmetro fornecido que verificará se ele já está armazenado na base de dados.
No PostgreSQL, o UPSERT está implementado partir da versão 9.5, e é executado a partir de um INSERT. A sintaxe simplificada de sua utilização é demonstrada na Listagem 1.
INSERT INTO TABELA([campo1],[campo2], […], [campo_n])
VALUES ([valor2],[valor2], […], [valor_n])
ON CONFLICT ([campo_chave])
DO UPDATE SET
[campo1] = [valor1],
[campo2] = [valor2],
[...] ,
[campo_m] = [valor_m]
Na sintaxe, pode-se notar que podemos inserir ou atualizar com o mesmo conjunto de valores, e até mesmo inserir ou atualizar com conjuntos diferentes de dados. A seguir, descreveremos como a utilização desse comando pode auxiliar a melhorar o desempenho da aplicação da locadora e também entender melhor sua sintaxe com os exemplos utilizados.
UPSERT na prática
No cenário de banco de dados da locadora, haverá a seguinte ação: toda vez que chegam filmes novos, é recebido um arquivo CSV com os dados de todos os filmes. Dessa maneira, a operação de inserção e atualização de filmes será feita através da importação desse arquivo para o sistema.
O arquivo de importação será como o que é ilustrado na Figura 2. Pelo padrão do arquivo, haverá a necessidade de extrair título, ano e idioma dos filmes, buscar na base de dados e, se já existirem, atualizar ou, se não existirem, inseri-los.