domingo, 20 de setembro de 2009

Criando Indices em grandes volumes de dados

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

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