Temos um data warehouse locado sobre o qual estamos fazendo relatórios. As consultas estão começando a demorar muito, e estamos procurando opções para reduzir isso. Há dois pensamentos no momento.
Crie tabelas agregadas específicas do inquilino e consulte-as.
Particionar horizontalmente os dados com base no inquilino.
A primeira opção significa que, para cada novo locatário integrado, precisaremos criar um novo conjunto de tabelas. Isso não é tão difícil, pois a inscrição de um novo inquilino vem com algumas semanas de antecedência, e a falta de relatórios será revelada no início, se esquecermos.
Particionar os dados para mim parece uma abordagem melhor, já que não estamos duplicando os dados. Não precisamos depender de um processo para transferir novos dados para as tabelas agregadas.
Eu estou querendo saber qual dessas opções seria melhor, se alguém já teve experiências semelhantes antes. O particionamento dos dados realmente ajuda? Ou não seria muito diferente de deixar todos os dados em um 'espaço'?
E, com o Oracle 10g, como particionar dados horizontalmente? Se eu tivesse a seguinte tabela:
TABLE Transaction(id, tenant_id, a, b, c, d)
Iremos migrar para o Oracle 11g em breve, então qualquer diferença no particionamento entre as versões será bem-vinda.
(Observação: tentei usar uma tag de particionamento, mas não o suficiente, se alguém pudesse adicionar uma tag, seria legal)
Para responder à sua segunda pergunta primeiro: sim, você deve particionar arquivos . O otimizador de consultas do Oracle possui um recurso chamado partição de eliminação , que verificará o predicado da partição e executará o SQL apenas nas partições apropriadas.
O particionamento também deixa todos os dados em um espaço. Conceitualmente, pense nisso como muitas tabelas de estrutura idêntica, com um implícito
UNION ALL
entre elas se você fizer umSELECT
a partir da tabela inteira. Exceto "sob o capô", o Oracle classifica as linhas reais na "tabela" correta com base nos critérios especificados. Quaisquer linhas que não correspondam a nenhum dos critérios vão para o que é conhecido como partição "padrão".Para o que você deseja fazer, uma "partição de intervalo" pode ser uma boa abordagem (para que você possa adicionar mais inquilinos posteriormente), por exemplo:
Então mais tarde
Isso criará algo que se parecerá e se comportará como uma tabela normal, mas, na verdade, as linhas em que tenant_id=1 estarão em uma partição no tablespace ts_tenant1 e as consultas ignorarão todas as outras partições. As consultas em toda a tabela podem ser executadas em paralelo em cada partição. Se tenant_id=4 neste cenário, a linha viverá em ts_default, a menos que você adicione a nova partição conforme mostrado, mas
INSERT
não será rejeitada porque não há partição para ela!FWIW No meu site, usamos tabelas particionadas em nosso DW de 40 TB, você não precisa se preocupar com o escalonamento ou desempenho dessa abordagem, se você escolher bem sua estratégia de particionamento (por exemplo, você pode particionar em tenant_id e subparticionar no mês, talvez), crie o índices corretos e assim por diante.