distribuindo tabelas por vários discos rígidos

2

Existe uma melhoria de desempenho quando distribuo tabelas de banco de dados em diferentes discos rígidos?

Eu preciso acessar muitos esquemas diferentes ao mesmo tempo e gostaria de saber se adicionar mais discos rígidos melhoraria significativamente o desempenho ao distribuir as tabelas pelos diferentes discos rígidos.

Então, digamos que eu tenha 100 tabelas e 1 disco rígido vs 100 tabelas e 10 discos rígidos . Isto faria diferença? Ou é melhor ligar os discos rígidos em uma configuração RAID?

    
por Jean-Paul 12.10.2014 / 22:05

3 respostas

5

Mais discos rígidos geralmente aumentam o desempenho teórico de IO. Por que quantidade útil difere muito no método. Em muitas aplicações do mundo real (e para números menores de discos), o aumento no desempenho de IO não está nem perto de linear.

Os cenários em que mais discos não aumentam o desempenho são, por exemplo, aqueles em que os limites do controlador (RAID) são atingidos. 10 high-end SSD em um controlador mais antigo ou barato (RAID), muitas vezes, resultará no controlador sendo o fator limitante, em vez do disco. Os níveis de RAID também são, no mínimo, tão importantes quanto ao fornecimento de proteção de dados quanto ao desempenho.
2 discos no RAID 1 (espelhamento) fornecem zero desempenho de gravação adicional, mas em um bom controlador ainda dobrará o desempenho de leitura.

A atribuição manual de discos (virtuais) a determinadas tarefas fornece caminhos de IO garantidos para essas tarefas, permitindo uma certa simultaneidade de nível dessas tarefas e é, por exemplo, algo que os administradores de banco de dados gostam de fazer. Claro que isso limita o desempenho máximo de cada tarefa individual também. E com qualquer ajuste (manual), errar pode prejudicar bastante o desempenho :)

Um único disco giratório SAS 15k corporativo oferece tipicamente cerca de 200-250 IOPS (operações IOPS por segundo). Basta colocar 10 discos oferecerão dez vezes isso.

Se no seu exemplo uma tabela estiver sendo usada predominantemente, atribuir essa tabela a 1 disco e ter as outras 99 tabelas nos outros discos restantes não traz benefícios mensuráveis, efetivamente você ainda estará limitado a cerca de 200 IOPS. Nesse cenário, tendo todas as 100 tabelas em um único volume RAID 10, você teria todos os 10 discos e, portanto, 2000+ IOPS para operações de leitura e 1000 IOPS (efetivo os recursos metade dos discos, 5 discos, devido ao espelhamento) para gravação. operações ... um grande aumento.

    
por 12.10.2014 / 23:49
3

Aumentar o rendimento de E / S quase sempre aumentará o desempenho. No entanto, não existe uma fórmula mágica para quantos discos rígidos devem ser usados para um determinado número de tabelas ou bancos de dados. Há muitos fatores a serem considerados: tamanho dos dados, design do esquema, gravação ou leitura pesada, número de consultas, etc.

Além de adicionar hardware adicional, sempre ajuda a analisar as estruturas de sua tabela e as consultas mais comuns executadas em seus bancos de dados. Às vezes, apenas adicionar um índice para os dados solicitados normalmente fará maravilhas que nem mesmo haverá mais hardware.

    
por 12.10.2014 / 22:39
1

Além de aumentar o número de discos físicos, você precisa modificar o Oracle para executar mais processos paralelos. Eu faço isso com:

NAME                           CURRENT_MEMORY_VALUE
------------------------------ ---------------------
parallel_max_servers           32
parallel_min_servers           8
parallel_servers_target        32
parallel_threads_per_cpu       4

Os comandos para fazer essas alterações são:

alter system set PARALLEL_MIN_SERVERS=8 scope=memory;          <== RAC
alter system set PARALLEL_MIN_SERVERS=8 scope=spfile sid='*';  <== RAC
alter system set PARALLEL_MAX_SERVERS=32 scope=memory;          <== RAC
alter system set PARALLEL_MAX_SERVERS=32 scope=spfile sid='*';  <== RAC
alter system set PARALLEL_SERVERS_TARGET=32 scope=memory;          <== RAC
alter system set PARALLEL_SERVERS_TARGET=32 scope=spfile sid='*';  <== RAC
alter system set PARALLEL_THREADS_PER_CPU=4 scope=memory;          <== RAC
alter system set PARALLEL_THREADS_PER_CPU=4 scope=spfile sid='*';  <== RAC

alter system set PARALLEL_MIN_SERVERS=8 scope=both;          <== NON RAC
alter system set PARALLEL_MAX_SERVERS=32 scope=both;          <== NON RAC
alter system set PARALLEL_SERVERS_TARGET=32 scope=both;          <== NON RAC
alter system set PARALLEL_THREADS_PER_CPU=4 scope=both;          <== NON RAC
    
por 17.10.2014 / 21:05