AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 2001
Accepted
Josh Smeaton
Josh Smeaton
Asked: 2011-03-31 17:45:18 +0800 CST2011-03-31 17:45:18 +0800 CST 2011-03-31 17:45:18 +0800 CST

Como faço para particionar horizontalmente uma tabela de banco de dados oracle e devo?

  • 772

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.

  1. Crie tabelas agregadas específicas do inquilino e consulte-as.

  2. 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)

oracle aggregate
  • 1 1 respostas
  • 3452 Views

1 respostas

  • Voted
  1. Best Answer
    Gaius
    2011-03-31T21:13:26+08:002011-03-31T21:13:26+08:00

    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 ALLentre elas se você fizer um SELECTa 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:

    create table transaction (id, tenant_id, a, b, c, d)
    partition by range(tenant_id)
    partition p_tenant1 values less than (2) tablespace ts_tenant1
    partition p_tenant2 values less than (3) tablespace ts_tenant2
    partition p_tenant3 values less than (4) tablespace ts_tenant3
    partition p_tenantd values less than (MAXVALUE) tablespace ts_default;
    

    Então mais tarde

    alter table transaction 
    add partition p_tenant4 values less than (5) tablespace ts_tenant4;
    

    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 INSERTnã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.

    • 8

relate perguntas

  • Backups de banco de dados no Oracle - Exportar o banco de dados ou usar outras ferramentas?

  • ORDER BY usando prioridades personalizadas para colunas de texto

  • Interface sqlplus confortável? [fechado]

  • Como encontrar as instruções SQL mais recentes no banco de dados?

  • Como posso consultar nomes usando expressões regulares?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve