Nihao,
Outro dia conversando com meu amigo de Mato Grosso do Sul me lembrei de algumas histórias, foi durante uma consultoria em Campo Grande que fiz o meu eject de Sao Paulo para Jundiaí, que deixem os paulistas lá com o Kassab.
Aliás Campo Grande lembra muito o Kansas , onde fica um dos laboratorios de desenvolvimento do Informix, lá tem muito gado e o povo é friendly, só falta mesmo o Tererê.
Por isto vou postar algumas informacoes de como criar um indice em uma tabela com tipo uns 256GB de dados, vamos pensar grande mesmo!!!
Bom primeiro passo, temos que usar o Informix 11 e precisamos saber qual a carga de I/O que nosso storage suporta, isto pode ser feito atraves da analise do TOPAS (AIX) ou TOP (Linux), imaginemos que num momento de pico nosso storage executa muito bem a leitura de 2GB/Seg, nao me lembro qual a media no meu ambiente, deve ser algo acima disto.
No lado f'isico do banco de dados iremos alocar um dbspace com tamanho de pagina de 16KB para armazenar dados e outro dbspaces com pagina de 16KB para armazenar o indice.
Lembre-se de criar um buffer pool de 16KB tambem, alias lembre-se de configurar 2 arquivos onconfig, uma que sera usado normalmente e outro que sera usado somente na criacao do indice.
Sobre o arquivo onconfig usado na criacao do indice devemos configurar o seguinte:
- Parametros de pre-fetch: ra_pages/ra_threshold, esses parametros sao validos para a instancia, inclusive o Cesar me alertou sobre isto.
Com um valor alto para pre-fetch os dados serao lidos mais rapidamente para a memoria e assim acelera a criacao do indice.
Na minha opniao este parametro deveria ser definido no escopo de buffer pool, pois assim poderiamos ter um pre-fetch agressivo para situacoes especificas.
- Parametros de LRU: os parametros de LRU_MIN e LRU_MAX tambem foram incluidos no parametro de criacao de buffer pool, a ideia 'e colocar valores altos para que a instancia nao entre em contencao de processos background para fazer flush.
- Parametros de Checkpoint: agora o Informix nao bloqueia a instancia durante o checkpoint, mas seria interessante desligar o parametro de checkpoint automatico.
- Area temporaria: procure criar dbspaces temporarios do mesmo tamanho do indice a ser criado, se a tabela for particionada tambem crie dbspaces temporarios de acordo com a quantidade de partitions que voce criar na sua tabela. Nao use filesystem para fazer sort do indice, por exemplo setando a variavel DBSPACETEMP ou DBTEMP para um diretorio, sempre direcione para um dbspace temporario.
- Parametros de PDQ: Procure setar os parametros de paralelismo (DS_*) , por default os valores estao definidos de forma ilimitada, isto pode causar contencao na criacao do indice.
Para a tabela ser criada com 256GB é necessario que o dbspace seja criado com página de 16KB, com isto será possivel criar a tabela com apenas um fragmento, porém a criaçao do indice vai demorar, entao procure particionar a tabela de acordo com alguma regra/coluna especifica de modo que os fragmentos comportem até 64GB.
É claro que não executei a criação de indice de tabelas com 256GB, no meu cenário atual fiz somente com 64GB e o tempo foi legal.
Se tiver algum problema como configurar o PDQ Priority dê uma olhada no site do Cesar (Se nao tiver nenhuma sessao falando de PDQ pode mandar email pra ele!!)
http://www.imartins.com.br/informix/
Agora imaginem que voce nao tenha uma janela de downtime de 6 horas para criar o indice o que voce deve fazer?
Neste caso voce pode clonar seu ambiente para um outro ambiente identico e neste criar o indice, ai com um pouco de bruxaria podemos transportar o indice inteiro para a producao sem ter que fazer rebuild, como ? (onunload/onload)
O onload/onunload permite fazer move de grandes volumes muito parecido com o recurso de transportable tablespace do Oracle, essas ferramentas existem desde a versao 7 e realmente sao muitos boas.
Vou deixar na lista de pendencias um post sobre onload/onunload, como sempre procurei passar o conceito de como criar um indice em um tabela com grande volume de dados, agora o como fazer fica como licao de casa.
Se eu esqueci de algum truque e alguem lembra por favor comentem.
Vagner
domingo, 20 de setembro de 2009
terça-feira, 15 de setembro de 2009
Truncate Table no Informix
Ni-hao,
Muitas vezes precisamos eliminar todo o conteudo tabela , isto deve ocorrer de forma rápida e sem impactos.
Até a versão 7 do Informix era comum executarmos um drop/create table, pois fazer um delete de todas as linhas da tabela não era algo eficiente.
A partir da versão 9.40 temos o truncate table, o mesmo foi melhorada e na versão 11.50 chegou a um excelente nivel de funcionalidade.
Segue abaixo as sintaxes do comando:
Truncate table your_table;
Truncate table your_table drop storage ;
Truncate table your_table reuse storage;
TRUNCATE TABLE
Este comando irá zerar o conteudo da tabela, a eliminacao de linhas nao ocorre, o Informix apenas elimina as referencias ao extent dentro da partition page, somente o extent inicial permance.
CLAUSULA DROP STORAGE
Tem a mesma função padrão do truncate table, ou seja elimina os extents subsequentes e insere esses espaços contiguos na free list do dbspace onde a tabela reside, assim outras tabelas ou indices podem reutilizar este espaco.
CLAUSULA REUSE STORAGE
Esta clausula é muito util, pois os extents não são removidos da tabela, as paginas de dados e bitmap apenas são marcadas como free , este recurso é muito útil em tabelas usadas por processos batches, onde são truncadas e populadas com frequência.
Vagner
Muitas vezes precisamos eliminar todo o conteudo tabela , isto deve ocorrer de forma rápida e sem impactos.
Até a versão 7 do Informix era comum executarmos um drop/create table, pois fazer um delete de todas as linhas da tabela não era algo eficiente.
A partir da versão 9.40 temos o truncate table, o mesmo foi melhorada e na versão 11.50 chegou a um excelente nivel de funcionalidade.
Segue abaixo as sintaxes do comando:
Truncate table your_table;
Truncate table your_table drop storage ;
Truncate table your_table reuse storage;
TRUNCATE TABLE
Este comando irá zerar o conteudo da tabela, a eliminacao de linhas nao ocorre, o Informix apenas elimina as referencias ao extent dentro da partition page, somente o extent inicial permance.
CLAUSULA DROP STORAGE
Tem a mesma função padrão do truncate table, ou seja elimina os extents subsequentes e insere esses espaços contiguos na free list do dbspace onde a tabela reside, assim outras tabelas ou indices podem reutilizar este espaco.
CLAUSULA REUSE STORAGE
Esta clausula é muito util, pois os extents não são removidos da tabela, as paginas de dados e bitmap apenas são marcadas como free , este recurso é muito útil em tabelas usadas por processos batches, onde são truncadas e populadas com frequência.
Vagner
Assinar:
Postagens (Atom)