Introdução
Recentemente executei um cenário no banco de dados SAP HANA para o qual precisava de um grande conjunto de dados inicial para uma tabela específica, e outro grande conjunto de dados delta que consistia em exclusões, atualizações e inserções no conjunto de dados inicial. Procurei no Google por algo como "gerador de dados para HANA", mas não encontrei o que procurava. Portanto, escrevi um procedimento de banco de dados para preencher minha tabela com os dados necessários. Como outros podem achar útil o script, expandi o script para facilitar sua reutilização. O resultado pode ser encontrado neste blog.
O procedimento
insere, atualiza ou exclui dados de uma única tabela, utilizando principalmente operações baseadas em conjuntos para um alto desempenho. As inserções e atualizações são baseadas na definição dos campos da tabela fornecida e contêm dados aleatórios. Por exemplo, para um campo inteiro, é inserido um valor inteiro aleatório, e para um campo baseado em caracteres, é inserida uma string aleatória de caracteres. O procedimento utiliza as tabelas de metadados do HANA para recuperar a definição da tabela. As atualizações ou exclusões de registros são feitas aleatoriamente com base na primeira coluna da chave primária.
Em meu pequeno sistema de testes, consegui uma velocidade de inserção de 9 milhões de registros por minuto para uma tabela com apenas alguns campos. Isso foi muito mais rápido do que a primeira versão do script, que não era baseada em conjuntos.
Como executar o procedimento gerador de dados
Siga os seguintes passos para gerar dados para sua tabela
-
Baixe o código neste
repositório do Git
e copie-o no console SQL
-
Crie uma sequência com a seguinte declaração: "CREATE SEQUENCE GENERATEDATASEQ1". Uma sequência com esse nome é usada no procedimento.
-
Chame o procedimento usando a seguinte declaração:
CALL "GenerateData" (
IP_SCHEMA_NAME => '<NOME_ESQUEMA>',
IP_TABLE_NAME => '<NOME_TABELA>',
IP_INSERT_NUM_RECORDS => <Número de registros a serem inseridos>,
IP_MAX_STRING_SIZE => <Tamanho máximo da string inserida. As strings são automaticamente limitadas no comprimento do campo>,
IP_DELETE_NUM_RECORDS => <Número de registros a serem excluídos>,
IP_UPDATE_NUM_RECORDS => <Número de registros a serem atualizados>
);
Limitações
Tenha em mente as seguintes limitações, ou ajuste o código para contorná-las:
-
Apenas suporta tabelas com uma chave primária. A chave primária deve conter pelo menos uma coluna que possa conter valores inteiros. Os tipos de dados binários não são suportados de forma alguma.
-
Criado com HANA 2, SPS04, não garantido que funcione com pacotes de serviços mais antigos.
-
Os valores gerados aleatoriamente dificultam a compressão. Portanto, é provável que você veja uma compressão mínima que não pode ser comparada com casos de uso reais.
Exemplo
Como exemplo, é criada uma tabela com a seguinte declaração:
CREATE SCHEMA GENERATEDATA;
SET SCHEMA GENERATEDATA;
CREATE