Comenatrio: A versão 11.7 não tem mais limitação de números de extents , mas não é por isso que vamos deixar nossos objetos serem construídos de forma desordenada e sem controle até porque isso influencia diretamente na performance.
Considerações iniciais :
Uma das tarefas do DBA é admistrar o numero de extents que as tabelas estão utilizando, caso essa administração não seja feita certamente em algum momento teremos uma mensagem -136 no more extentsque será retornado após a execução de um comando INSERT.
O que vou escrever abaixo é uma resposta a qual busquei por algum tempo, lá traz quando comecei a mexer com informix quando me falaram que o banco precisava ser exportado e importado para reorganizar os extents ... isso nunca entrou na minha cabeça como um banco de dados tão eficiente exige uma manutenção tão radical ... e não tinha explicações nem sobro o que era extents e muito menos como não cair no problema -136 então como muitas coisas fui a luta pesquisar e abaixo estarei passando a explicação de como definir o numero maximo de extents que uma tabela comporta.
para determinar o numero maximo de extents de uma tabela é uma tarefa muito simples.
Não posso deixar de falar agora neste assunto apesar de nosso objetivo ser apenas aprender o numero maximo de extents , mas vou falar superficialmente somente para chamar a atenção -- É DE FUNDAMENTAL IMPORTANCIA CONHECERMOS O BANCO DE DADOS E AS PROJEÇÕES DE CRESCIMENTO DAS TABELAS ...
Os 4 passos abaixo são exatamente o que precisa ser feito para achar o numero maximo de extents.
1. execute o comando oncheck -pt databaseanme:tablename
2. oncheck -pP <
3. Additional_extents = trunc (frcnt / 8)
4. Maximum_number_extents = Additional_extents + Number_of_extents
.... verdade esses 4 passos é simples, mas vamos ter colegas que estão ainda começando a trabalhar com informix que terão ainda certa dificuldade então vamos melhorar o exemplo.
Vou utilizar no meu exemplo uma tabela chamada "cidade" e uma database com o nome "eli"
1. execute o comando oncheck -pt databaseanme:tablename
$ oncheck -pt eli:estoque more # estou usando more pois o que me intereça é o começo do retorno ..
Retorno do comando :
TBLspace Report for eli:eis.cidade
Physical Address 5:487 Creation date 11/23/2009 19:58:07 TBLspace Flags 801 Page Locking TBLspace use 4 bit bit-maps Maximum row size 26
Number of special columns 0
Number of keys 0
Number of extents 1
Current serial value 1
Pagesize (k) 2
First extent size 8
Next extent size 8
Number of pages allocated 8
Number of pages used 3
Number of data pages 2
Number of rows 69
Partition partnum 5242932
Partition lockid 5242932
Extents Logical Page Physical Page Size Physical Pages 0 5:831 8 8
2. oncheck -pP
$ oncheck -pP 5 487 more # estou usando more pois o que me intereça é o começo do retorno.
addr stamp chksum nslots flag type frptr frcnt next prev
5:487 -892218219 1fa6 5 802 PARTN 160 1864 0 0
slot ptr len flg 1 24 92 0 2 116 28 0 3 144 0 0 4 144 0 0 5 144 16 0
Comentario: No retorno acima está evidenciado na cor vermelha as informações as quais são necessarias para chegarmos no resultado que este tutorial propoe.
3. Additional_extents = trunc (frcnt / 8)
Agora já temos todas as informações é só fazer conta
Additional_extents = (1864 / 8)
4. Maximum_number_extents = Additional_extents + Number_of_extents
Maximum_number_extents = 233 + 1
Maximum_number_extents = 234
BEM SABEMOS AGORA QUE A TABELA "CIDADE" DA DATABASE "ELI" COMPORTA UM NUMERO MAXIMO DE 234 EXTENTS , APÓS ATINGIR ESSE NUMERO VAI ACONTECER O ERRO -166 ...
ATENÇÃO 234 não é um tamanho é uma quantidade ou seja dentro destes234 posso administrar o tamanho dos extents, passando na criação das tabelas informações de size de extent ... porém esse assunto vamos discutir em outra postagem ...
Quando deixamos o banco de dados alocar os extents de maneira automatica inicialmente ele vai alocar o primeiro extent com 8 KB e vai seguir com a alocação dos demais extents seguindo a logica de quando atingir 16 extents eles dobra o tamanho ou seja o primeiro foi criado com 8KB o decimo setimo terá 16 Kb o vigezimo quinto terá 32 Kb e assim por diante ... mas isso não precisa ser assim podemos tratar esses valores definindo eles na criação da tabela facilmente ..
Dicas:
1. É importante tenatar criar os extents de maneira contiguos , o que vai limitar o deslocamento da cabeça de leitura.
2. Quando possivél coloque as tabelas em dbspaces separados.
3. Verifique constantemente como os extents estão distribuidos no dbspace , para isso utilize o comando oncheck -pe
Como pode eliminar o problema de extents intercalados ?
1. Reorganizar as tabelas exportando dados e importando (isso requer recriar a tabela)
2. Criar ou alterar um índice de cluster.
3. Use o ALTER TABLE FRAGMENT
Em outras postagens neste BLOG vai existir mais conteudo sobre o assunto extent , fragmentação ..