[firebase-br] Identificador para tabelas

Eduardo Jedliczka edujed em gmail.com
Ter Maio 3 18:49:50 -03 2005


Francisco,

Não creio que ele esteja falando em "alterar" as informações, imagino que
queira apenas consultar. Mas sim, ele tem uma "super-consulta"

Pelo que entendi, é uma tabela com 70 campos e 10 junções.

Sinceramente, acho que se o sistema dele crescer e manter a estrutura com
Computed By, os clientes vão chingar a mãe dele numa taxa de crescimento
geométrica.

A maior vantagem de utilizar Joins é que o banco trabalha menos (consome
menos memória, faz menos acesso à disco, e utiliza drasticamente menos o
analizador léxico), o que resulta em melhor performance como um todo.

Se ele não pode trabalhar com views, até é compreensível, há muitos
componentes que dão pau com views. Mas uma Query bem montada com 7 ou 8
junções, que tragam apenas os registros que se precisa, é muito rápido. O
problema é quando surgem os "full outer joins" ou os "left Joins com Right
Joins" aí o banco chora mesmo...

E apenas uma última pergunta ao Edson, se o componente escreve a Where, como
ele faz para filtrar os Computed By ???

Se não souber eu respondo. Full table Scan...  ou seja, varre a tabela pai,
resolve o campo calculado linha a linha ( se tiver 100 mil registros, ele
buscará o índice 100 mil vezes e se não tiver índice para este campo, fará
um full table scan na tabela filha 100 mil vezes.) e retorna apenas o que
cumprir a condição. ( ou seja 100 mil registros da tabela pai "multiplicado"
pelos registros da tabela filha)

Se for através de um Join, o otimizador fará apenas uma busca entre chaves.
o ganho de desempenho é absurdo!

[s]

======================
Eduardo Jedliczka
Apucarana - Paraná
======================
----- Original Message -----
From: "Francisco Thiago" <jeandeadlucky em yahoo.com.br>
To: "FireBase" <lista em firebase.com.br>
Sent: Tuesday, May 03, 2005 6:20 PM
Subject: Re: [firebase-br] Identificador para tabelas


> kra, deixa eu ver se entendi.
>
> Você quer uma espécie de super consulta, onde na tabela de pedido, se o
> usuário digitar o nome do Cliente, esta consulta traga todos os cliente
> certo? E para piorar a situação, você ainda quer que o kra altere esses
> dados?
>
> Você pode fazer o seguinte:
>
>>
> Monte uma tela de consulta e faça o select utilizando joins.
> Ae quando o usuario escolher, por exemplo, o nome do cliente, ele traga os
> pedidos do cliente
>
> Select Pedido.NumPedido
>      , Clientes.NomeCliente
> from Pedido
>   join Clientes on Clientes.Codigo = Pedido.CodigoClientes
> where
>   Clientes.NomeCliente = 'José das Cucuias'
>
> Funciona do jeito que vc qr.
>
>> O mesmo esquema acima, só que depois vc devolve apenas a chave do Pedido
> para uma outra consulta e traz os dados do pedido tranquilo... e pode
editar
> e tudo... Daí sua tela de pesquisa ficaria realmente genérica.
>
> 3º (Caso esteja utilizando ClientDataSet)
> Cria uma view com os dados necessário, Chama ela pelo CDS e no Evento
> OnGetTable coloca o nome da tabela. Não se esqueça que desta forma você
> precisa trazer na view os nomes exatos dos campos a serem atualizados e
> ainda por cima desmarcar para alteraçãos os campos inalteráveis (nome do
> cliente por exemplo). NUNCA TENTEI ISSO....
>
> Caso o problema seja filtros e ordenações por colunas, você pode usar
> índices automáticos e campos de filtros. Com o CDS é muito fácil fazer
isso.
> Dessa forma você já economiza alguns select no banco... já que para
> reordenar uma coluna, vc teria que requisitar os mesmos campos ao BD.
>
> Espero ter entendido a sua questão e ter ajudado vc um pouquinho
>
> []'s e boa sorte
>
> Francisco Thiago de Almeida
> Enter&Plug Informática
> Divisão: Desenvolvimento e Banco de dados
> MSN: thiago em enterplug.com.br
> Skype: enterplug_thiago
>
>
> ----- Original Message -----
> From: "Edson T. Marques" <marques em oriontec.com.br>
> To: "FireBase" <lista em firebase.com.br>
> Sent: Tuesday, May 03, 2005 5:42 PM
> Subject: Re: [firebase-br] Identificador para tabelas
>
>
> >
> > Infelizmente não posso usar view.
> > Nós temos um componente, feito em delphi, que permite fazer a
manipulação
> > das consultas que são exibidas na tela para o usuário. Com este
componente
> > nós implementamos funcionalidades muito importantes para o nosso
sistema.
> > Uma delas é, por exemplo, se o usuário vê na tela o Grid de produtos
> > cadastrados ele poderá fazer filtros da maneira que ele quizer, em
> > qualquer coluna, que os filtros (tem uma interface apropriada para isso)
> > são transformados em SQL e incorporados na clausula where da consulta
que
> > retorna oque ele está vendo.
> >
> > Se eu criar uma view no banco de dados para retornar esses dados, além
de
> > eu não me livrar dos joins (porque o select da view também vai ter que
ter
> > as junções), o esquema do componente vai fazer selects sobre result set
da
> > view, bom...  aí é que a vaca vai pro brejo pra valer!
> >
> > Eu preciso é de uma sentença sobre essa questão.
> > Na sua opinião oque que é menos pior os campos calculados ou os joins?
> >
> > [s]
> > Edson.
> >
> > Eduardo Jedliczka escreveu:
> >
> >>Edson,
> >>
> >>Para o seu caso, a melhor solução seria criar uma VIEW.  - Recomendo a
> >>leitura dos PDFs do Interbase 6 sobre Views e Joins.
> >>
> >>Dependendo do seu componente de acesso, poderia gravar os campos na
tabela
> >>real e consultar pela view, em outros casos, poderia criar algumas
> >>Triggers
> >>na view para realizar o insert, delete e update...
> >>
> >>Posso dar mais detalhes à noite...
> >>
> >>[s]
> >>
> >>==========================
> >>Eduardo Jedliczka
> >>Gerasoft Informática
> >>Apucarana - Pr
> >>==========================
> >>
> >>----- Original Message -----
> >>From: "Edson T. Marques" <marques em oriontec.com.br>
> >>To: "FireBase" <lista em firebase.com.br>
> >>Sent: Tuesday, May 03, 2005 4:16 PM
> >>Subject: Re: [firebase-br] Identificador para tabelas
> >>
> >>
> >>
> >>>Ok!
> >>>
> >>>Sem querer ser chato... e já sendo, vamos a um exemplo prático.
> >>>
> >>>Meu banco de dados possui uma tabela de produtos com 70 campos. Essa
> >>>tabela de produtos se relaciona com 10 outras tabelas:
> >>>Grupos, SubGrupos, Classificações1, Classificações2, Classificações3,
> >>>Classificações4, Fabricantes, Unidades, CategoriasDimensionais e
> >>>ClassificaçãoFiscal.
> >>>Em cada uma dessas tabelas existe uma chave primária que tem um
> >>>relacionamento com a tabela de produtos e existe outro campo VARCHAR
com
> >>>a descrição.
> >>>A tabela de produtos, portanto, possui um índice de fk para cada chave
> >>>do relacionamento.
> >>>
> >>>Atualmente, então, minha tabela de produtos possui os 70 campos que
> >>>falei mais 10 campos com as chaves das tabelas com que se relaciona.
> >>>Alem disso mais 10 campos calculados com select (daquele jeito) para me
> >>>dar as descrições dos registros das tabelas com as quais a tabela de
> >>>produto se relaciona.
> >>>
> >>>Assim:
> >>>
> >>>CREATE TABLE PRODUTO (
> >>>   CHAVEPRO INTEGER NOT NULL,
> >>>   CHAVEGRU CHAR(3),
> >>>   CHAVESGR CHAR(3),
> >>>   CHAVECL1 CHAR(3),
> >>>   CHAVECL2 CHAR(3),
> >>>   CHAVECL3 CHAR(3),
> >>>   CHAVECL4 CHAR(3),
> >>>   CHAVEFAB CHAR(3),
> >>>   CHAVECDI NUMERIC(2,0) DEFAULT 0,
> >>>   CHAVECLF VARCHAR(2),
> >>>   UNIDADE VARCHAR(3) NOT NULL,
> >>>   REFERENCIA VARCHAR(15),
> >>>   NOME VARCHAR(50) NOT NULL COLLATE WIN_PTBR,
> >>>   NOMEECF VARCHAR(30),
> >>>   COMPLEMENTO VARCHAR(256),
> >>>   COR VARCHAR(10),
> >>>...
> >>>
> >>>  FABRICANTE COMPUTED BY ((select Nome from Fabricante F where
> >>>F.ChaveFab = Produto.ChaveFab)),
> >>>  GRUPO COMPUTED BY ((select Nome from Grupo G where G.ChaveGru =
> >>>Produto.ChaveGru)),
> >>>  SUBGRUPO COMPUTED BY ((select Nome from SubGrupo S where S.ChaveSGr =
> >>>Produto.ChaveSGr)),
> >>>  CLASSIFIC1 COMPUTED BY ((select Nome from Classific1 C where
> >>>C.ChaveCl1 = Produto.ChaveCl1)),
> >>>  CLASSIFIC2 COMPUTED BY ((select Nome from Classific2 C where
> >>>C.ChaveCl2 = Produto.ChaveCl2)),
> >>>  CLASSIFIC3 COMPUTED BY ((select Nome from Classific3 C where
> >>>C.ChaveCl3 = Produto.ChaveCl3)),
> >>>  CLASSIFIC4 COMPUTED BY ((select Nome from Classific4 C where
> >>>C.ChaveCl4 = Produto.ChaveCl4)),
> >>>  DESCRCDIM COMPUTED BY ((select Descricao from CatDimens C where
> >>>C.ChaveCDi = Produto.ChaveCDi)),
> >>>  CLASSFISC COMPUTED BY ((select CODIGO from CLASSFISC C where
> >>>C.ChaveClF = Produto.ChaveClF)),
> >>>  ...
> >>>);
> >>>
> >>>Então, na interface (cliente) eu só dou um select nessa tabela e tenho
> >>>todos os campos que necessito.
> >>>Aí beleza, É o que eu tenho atualmente.
> >>>Neste caso você me orientaria a mudar essa estrutura, eliminar os
campos
> >>>calculados e fazer joins para obter o campos na interface. Dessa forma
> >>>eu teria uma performance muito melhor?
> >>>
> >>>Seria isso?
> >>>
> >>>
> >>>
> >>>______________________________________________
> >>>FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
> >>>Para editar sua configuração na lista, use o endereço
> >>>
> >>http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
> >>
> >>>Para consultar mensagens antigas:
> >>>
> >>http://search.gmane.org/search.php?group=firebase
> >>
> >>>
> >>
> >>
> >>______________________________________________
> >>FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
> >>Para editar sua configuração na lista, use o endereço
> >>http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
> >>Para consultar mensagens antigas:
> >>http://search.gmane.org/search.php?group=rebase
> >>
> >>
> >>
> >
> >
> > ______________________________________________
> > FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
> > Para editar sua configuração na lista, use o endereço
> > http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
> > Para consultar mensagens antigas:
> > http://search.gmane.org/search.php?group=firebase
> >
>
>
>
>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
> Para editar sua configuração na lista, use o endereço
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
> Para consultar mensagens antigas:
http://search.gmane.org/search.php?group=firebase





Mais detalhes sobre a lista de discussão lista