O Oracle, como um banco de dados muito grande, é amplamente utilizado em grandes organizações com grande capacidade de transferência de dados e extensas redes de computadores, como finanças, correios e telecomunicações, energia elétrica e aviação civil. Quanto aos administradores de sistemas, é particularmente importante garantir o funcionamento estável da rede e melhorar o desempenho da base de dados para torná-la mais segura e eficiente. Como um fator importante que afeta o desempenho do banco de dados, a fragmentação do banco de dados deve despertar a atenção suficiente do DBA. A descoberta e limpeza oportuna de fragmentos é um conteúdo básico de manutenção do DBA.
1. Por que ocorrem fragmentos?
Quando um banco de dados é gerado, ele será dividido em vários segmentos lógicos (segmentos) conhecidos como espaços de tabela (espaço de tabela), como espaço de tabela de sistema (sistema), espaço de tabela temporário (temporário), etc. Um espaço de tabela pode conter vários intervalos de dados (Extent) e um ou mais blocos de intervalo livre, ou seja, espaço livre (Espaço Livre).
Os relacionamentos lógicos entre espaços de tabelas, segmentos, categorias e espaços livres são os seguintes:
Quando um segmento é criado em um espaço de tabelas, o espaço será alocado para o escopo inicial do segmento a partir do espaço livre efetivo do espaço de tabelas. Quando esses intervalos iniciais forem preenchidos com dados, o segmento solicitará a adição de outro intervalo. Este processo de expansão continuará até que o valor máximo do intervalo seja atingido e pode não haver espaço livre no espaço de tabela para o próximo intervalo. A situação mais ideal é que os dados de um segmento possam ser armazenados em uma única categoria. Dessa forma, todos os dados são armazenados próximos a outros dados no segmento e menos ponteiros são necessários para localizar os dados. No entanto, há muitos casos em que um segmento contém vários campos e não há como provar que esses campos estão armazenados próximos. Quando um requisito de espaço deve ser atendido, o banco de dados não fecha mais o intervalo livre adjacente (a menos que não haja nenhuma maneira), mas procura o maior intervalo livre no espaço de tabela para usar. Isso irá formar gradativamente espaços livres cada vez mais discretos, separados, menores, ou seja, fragmentos.
2. Impacto da fragmentação no sistema
Com o passar do tempo, o uso generalizado de sistemas aplicativos baseados em banco de dados gerará cada vez mais fragmentos, que terão os seguintes dois impactos importantes no banco de dados:
1) Incorrer em redução de desempenho do sistema
Em geral, quando um requisito de espaço deve ser atendido, o banco de dados procurará primeiro a maior área livre no momento, e a "maior" área livre gradualmente se tornará menor, e se tornará cada vez mais difícil encontrar uma área livre suficientemente grande. é difícil, então os obstáculos de velocidade no espaço de tabela tornam a alocação de espaço do banco de dados cada vez mais distante do estado ideal;
2) Distribua uma grande quantidade de espaço de mesa
Embora algumas áreas livres (como o pctincrease do espaço de tabela seja diferente de zero) sejam mescladas periodicamente pelo processo do chefe de segundo plano SMON (monitoramento do sistema), sempre há algumas áreas livres que não podem ser fechadas automaticamente, desperdiçando muito espaço de tabela espaço.
3. Cálculo de fragmentos de categorias livres
Como a fragmentação do espaço livre é composta por várias partes, como o número de categorias, o tamanho máximo do intervalo, etc., podemos usar o valor FSFI - Índice de Fragmentação de Espaço Livre (Índice de Fragmentação de Espaço Livre) para refletir intuitivamente:
FSFI=100*SQRT(max(extensão)/soma(extensões))*um/SQRT(SQRT(contagem(extensões)))
Como pode ser visto, o valor máximo de FSFI é 100 (um espaço de tabela único ideal). À medida que o escopo aumenta, o valor FSFI diminui lentamente e, à medida que o tamanho máximo do escopo diminui, o valor FSFI diminui rapidamente.
O seguinte script pode ser usado para calcular o valor FSFI:
rem cálculo de valor FSFI
rem fsfi.sql
coluna formato FSFI 999,99
selecione tablespace_name,sqrt(max(blocos)/soma(blocos))*
(100/sqrt(sqrt(contagem(blocos)))) FSFI
de dba_free_space
agrupar por tablespace_name ordenar por um;
carretel fsfi.rep;
/
carretel;
Por exemplo, ao executar o script fsfi.sql em um determinado banco de dados, os seguintes valores FSFI são perdidos:
TABLESPACE_NAMEFSFI
------------------------------- -------
RBS 74.06
SISTEMA 100,00
TEMPERATURA 22,82
FERRAMENTAS 75,79
USUÁRIOS 100,00
USER_TOOLS 100,00
YDCX_DADOS 47.34
YDCX_IDX 57.19
YDJF_DATA 33,80
YDJF_IDX 75,55
---- Uma vez calculado o valor FSFI do banco de dados, ele pode ser usado como um parâmetro comparável. Em um espaço de tabela com espaço livre efetivo suficiente e um valor FSFI acima de 30, raramente são encontrados problemas de espaço livre efetivo. Quando um espaço está próximo de parâmetros comparáveis, ele precisa ser desfragmentado.
4. Classificando os fragmentos das categorias livres
O valor pctincrease do espaço de tabela é diferente de zero
É possível alterar o parâmetro de armazenamento padrão pctincrease do espaço de tabela para diferente de zero. Normalmente defina-o como um, como:
alterar a temperatura do espaço de tabela
armazenamento padrão (pctincrease 1);
Desta forma, o SMON agrupará automaticamente as categorias gratuitas. Você também pode agrupar categorias gratuitas manualmente:
alterar temperatura do espaço de tabela coalescer;
5. Recolhendo os fragmentos do parágrafo
Sabemos que os segmentos são compostos por categorias. Em alguns casos, é necessária a limpeza dos fragmentos do segmento. Para visualizar informações relacionadas ao segmento, visualize o dicionário de dados dba_segments e, para obter informações de categoria, visualize o dicionário de dados dba_extents.
Segmento de dados de consulta
selecione segment_name, tablespace_name, bytes, blocos de USER_EXTENTS;
Segmento de diretório de consulta
selecione index_name,table_owner,table_name,tablespace_name de USER_EXTENTS;
Visualize informações do segmento por meio de dba_segments
selecione tablespacee_name,count(*) nobjects,round(soma(bytes)/1024/1204/1024.2) GB,soma(blocos),soma(extensões) de
grupo dba_segments por rollup(tablespace_name);
Se um segmento estiver excessivamente fragmentado, a maneira mais fácil de compactar seus dados em um intervalo é reconstruir o segmento com os parâmetros de armazenamento corretos e, em seguida, inserir os dados da tabela antiga na nova tabela e, ao mesmo tempo, excluir a tabela antiga. . Este processo pode ser realizado utilizando a ferramenta Importação/Exportação (entrada/saída).
O comando Export () possui um sinalizador (compactado), que ao ler a tabela fará com que o Export determine a quantidade de espaço físico alocado para a tabela e gravará um novo parâmetro de armazenamento de inicialização nos dados de dump de saída - ou seja, todos Aloque espaço. Se esta tabela estiver fechada, utilize a ferramenta Import() para regenerá-la. Dessa forma, seus dados serão colocados em um novo segmento inicial maior. por exemplo:
exp usuário/senha arquivo=exp.dmp compress=Y grants=Y índices=Y
tabelas=(tabela um, tabela dois);
Se a saída ocorrer sem problemas, exclua a tabela exportada da biblioteca e importe a tabela dos dados de despejo de saída:
imp usuário/senha arquivo=exp.dmp commit=Y buffer=64000 full=Y