[firebase-br] Modelagem para ganhar desempenho

Paulo Portella pportellaa.firebase em gmail.com
Sex Fev 25 14:02:59 -03 2011


Em 25/02/2011 13:43, Marcelo Moreira escreveu:
> Paulo,
> Trata-se de um sistema de envio de SMS.
>
> O que acontece é que antes o sistema operava como vc descreveu, apenas uma
> tabela e todos os processos acabavam ficando um pouco lento. depois que
> dividimos melhorou consideravelmente e nisso deixamos de ter problemas de
> fullscan na tabela.
> Realmente todos os selects que tenho nos processos sempre retornam um unico
> registro:
> select campos ... from tabela where id = :id
> Referente a saber onde o registro esta ate que nao é o problema ... porque o
> ponto critico do aplicativo é gerenciar os registros que estao na tabela
> TB_TRABALHO ... depois que eles vao pra tabela TB_HISTORICO so interessa
> mesmo aos clientes que precisam fazer algum tipo de consulta no historico
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use: http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa

Então? Você ficar alimentando uma tabela e depois jogando o seu conteudo 
para outra tabela, só fará seu banco ficar cada vez maior à toa, diga-se 
de passagem.

Experimente fazer o que eu lhe disse, use só uma tabela e adicione um 
campo para determinar se aquela linha de registro já foi processada.

Uma maneira de você trabalhar isso melhor, seria por eventos, eu estou 
imaginando assim:
* Você tem uma tabela alimentada por vários usuários onde são inseridos 
os números de telefone com as mensagens que deverão ser enviadas
* Você tem um único serviço que abre essa tabela e processa as mensagens 
uma-a-uma, correto?
então você pode trabalhar por eventos, exemplo:
no Banco de Dados:
CREATE TABLE TB_TRABALHO (
ID INTEGER NOT NULL PRIMARY KEY AUTO SEQUENCIAL,
SITUTACAO CHAR(1),
DDD CHAR(3),
TELEFONE CHAR(9),
MENSAGEM VARCHAR(255));

No aplicativo cliente, use comandos diretos, por exemplo:

'INSERT INTO TB_TRABALHO VALUES 
('+'A'+','+edtDDD.Text+','+edtTelefone.text+','Mensagem+')';


Agora, no aplicativo "Servidor":
Ponha um TTimer, habilitado pra executar, tipo, 10 em 10 minutos, sei lá:

Ttimer.Enabled:=false;
cdsTrabalho.Close;
cdsTrabalho.CommandText:=' SELECT * FROM TB_TRABALHO WHERE SITUACAO=+'A';
cdsTrabalho.Open;
cdsTrabalho.First;

While not(cdsTrabalho.eof) do
begin
if EnviaMensagem(cdsTrabalhoDDD.Text,cdsTabalhoTELEFONE.Text, 
cdsMensagem.text) then
begin
cdsTrabalho.Edit;
cdsTrabalhoSITUACAO.AsString:='H';
cdsTrabalho.Post;
end else cdsTrabalho.next;
end;

Ttimer.Enabled:=true;

tu não precisará fazer NEXT quando der o POST, pois ao dar o POST o 
registro "some", veja o CommandText acima.

Tenta pra ver.

-- 
Vida de americano é assim: iPhone, iPod, iPad, iMac….
Já a de brasileiro é assim:IPTU, IPVA, ICMS, IPI etc





Mais detalhes sobre a lista de discussão lista