1. Por que particionar os dados?
O particionamento do banco de dados pode reduzir significativamente o atraso na resposta do sistema, ao mesmo tempo que aumenta o rendimento dos dados. Especificamente, o particionamento tem os seguintes benefícios:
- O particionamento torna grandes tabelas mais fáceis de gerenciar. As operações de manutenção em subconjuntos de dados também são mais eficientes, porque essas operações são apenas para os dados necessários, e não para a tabela inteira. Uma boa estratégia de particionamento reduzirá a quantidade de dados a serem verificados, lendo apenas os dados relevantes necessários para satisfazer a consulta. Quando todos os dados estão na mesma partição, consultas, cálculos e outras operações no banco de dados serão restritas ao gargalo de E / S de acesso ao disco.
- O particionamento permite que o sistema faça uso total de todos os recursos. Com um bom esquema de particionamento e computação paralela, a computação distribuída pode fazer uso completo de todos os nós para concluir tarefas que geralmente são concluídas em um nó. Quando uma tarefa pode ser dividida em várias subtarefas dispersas e cada subtarefa acessa uma partição diferente, a eficiência pode ser melhorada.
- O particionamento aumenta a disponibilidade do sistema. Porque a cópia da partição geralmente é armazenada em nós físicos diferentes. Portanto, quando uma partição está indisponível, o sistema ainda pode chamar outras partições de réplica para garantir a operação normal do trabalho.
2. Método de partição
DolphinDB suporta uma variedade de métodos de particionamento: partição de intervalo (RANGE), partição de hash (HASH), partição de valor (VALUE), partição de lista (LIST), partição composta (COMPO).
- O particionamento de intervalo cria uma partição para cada intervalo, que é o método de particionamento mais comumente usado e recomendado. Você pode colocar todos os registros cujos valores estão em um intervalo em uma partição.
- O particionamento de hash usa funções de hash para operar em colunas de partição para facilitar o estabelecimento de um número especificado de partições.
- A partição de valor cria uma partição para cada valor, como data de negociação de ações e mês de negociação de ações.
- O particionamento de lista é baseado em listas enumeradas pelo usuário, que é mais flexível do que o particionamento de valor.
- O particionamento composto é adequado para grandes quantidades de dados e as consultas geralmente envolvem duas ou mais colunas de partição. Cada seleção de partição pode usar partição de intervalo, valor ou lista. Por exemplo, divida o valor pela data da transação de estoque e divida o intervalo por código de estoque.
Podemos usar a função de banco de dados para criar um banco de dados.
语法 :banco de dados (diretório, [partitionType], [partitionScheme], [locations])
parâmetro
diretório: o diretório onde o banco de dados é salvo. O DolphinDB tem três tipos de bancos de dados, que são banco de dados na memória, banco de dados em disco e banco de dados em sistema de arquivos distribuído. Para criar um banco de dados na memória, o diretório está vazio; para criar um banco de dados local, o diretório deve ser um diretório do sistema de arquivos local; para criar um banco de dados em um sistema de arquivos distribuído, o diretório deve começar com "dfs: //". Este tutorial usa a criação de um banco de dados local do Windows como exemplo.
partitionType: modo de partição, existem 5 modos: partição de intervalo (RANGE), partição de hash (HASH), partição de valor (VALUE), partição de lista (LIST), partição composta (COMPO).
partitionScheme: esquema de partição. Os esquemas de partição correspondentes a vários métodos de particionamento são os seguintes:
localizações: especifique a localização do nó onde cada partição está localizada. Se for um banco de dados do sistema de arquivos distribuído ou um banco de dados do tipo partição composta (COMPO), o parâmetro de locais não pode ser usado.
2.1 partição de intervalo
A partição do intervalo é determinada pelo vetor de partição. O vetor de partição representa o intervalo, incluindo o valor inicial, mas não o valor final.
No exemplo a seguir, o banco de dados db possui duas partições: [0,5) e [5,10). Use a função append! Para salvar a tabela t como a tabela de partição pt no banco de dados db e use o ID como a coluna de partição.
n = 1000000 ID = rand (10, n) x = rand (1.0, n) t = tabela (ID, x) db = banco de dados ("dfs: // rangedb", RANGE, 0 5 10) pt = db.createPartitionedTable (t, `pt,` ID) pt.append! (t); pt = loadTable (db, `pt) selecione a contagem (x) de pt
2.2 Partição de hash
A partição hash usa uma função hash na coluna da partição para gerar partições. O particionamento hash é uma maneira fácil de gerar um número específico de partições. Mas deve-se notar que a partição hash não pode garantir o mesmo tamanho da partição, especialmente quando a distribuição do valor da coluna da partição é distorcida. Além disso, ao procurar dados em uma área contínua na coluna de partição, a eficiência da partição hash é menor do que a da partição de área ou partição de valor.
No exemplo a seguir, o banco de dados db tem duas partições. Use a função append! Para salvar a tabela t como a tabela de partição pt no banco de dados db e use o ID como a coluna de partição.
n = 1000000 ID = rand (10, n) x = rand (1,0, n) t = tabela (ID, x) db = banco de dados ("dfs: // hashdb", HASH, [INT, 2]) pt = db .createPartitionedTable (t, `pt,` ID) pt.append! (t); pt = loadTable (db, `pt) selecione a contagem (x) de pt
2.3 partição de valor
A partição de valor usa um valor para representar uma partição. O exemplo a seguir define 204 partições. Cada zona representa um mês entre janeiro de 2000 e dezembro de 2016.
n = 1000000 mês = take (2000.01M..2016.12M, n) x = rand (1.0, n) t = table (month, x) db = database ("dfs: // valuedb", VALUE, 2.000.01M .. 2016,12M) pt = db.createPartitionedTable (t, `pt,` mês) pt.append! (T) pt = loadTable (db, `pt) selecione contagem (x) de pt
2.4 Lista de partição
Na partição LIST, usamos uma lista contendo vários elementos para representar uma partição. O exemplo a seguir tem duas partições, a primeira partição contém 3 códigos de estoque e a segunda partição contém 2 códigos de estoque.
n = 1000000 ticker = rand (`MSFT`GOOG`FB`ORCL`IBM, n); x = rand (1.0, n) t = table (ticker, x) db = database ("dfs: // listdb", LIST, [`IBM`ORCL`MSFT,` GOOG`FB]) pt = db.createPartitionedTable ( t, `pt,` ticker) pt.append! (t) pt = loadTable (db, `pt) selecione contagem (x) de pt
2.5 Partição combinada
A partição de combinação (COMPO) pode definir 2 ou 3 colunas de partição. Cada coluna pode ser particionada independentemente por intervalo (RANGE), valor (VALUE) ou lista (LIST). As várias colunas da partição combinada são logicamente paralelas e não há subordinação ou relacionamento de prioridade.
n = 1000000 ID = rand (100, n) datas = 2017.08.07..2017.08.11 data = rand (datas, n) x = rand (10,0, n) t = tabela (ID, data, x) dbDate = banco de dados (, VALUE, 2017.08.07..2017.08.11) dbID = database (, RANGE, 0 50 100) db = database ("dfs: // compoDB", COMPO, [dbDate, dbID]) pt = db.createPartitionedTable ( t, `pt,` date`ID) pt.append! (t) pt = loadTable (db, `pt) selecione contagem (x) de pt
O exemplo acima cria 5 partições de valor.
Na partição 20170807, existem 2 partições de intervalo.
O tutorial de particionamento de banco de dados (2) irá introduzir os princípios de particionamento de banco de dados e esquemas de particionamento especiais