Ola pessoal, fiquei um tempo sem voltar nesse projeto e agora precisarei 
retomar o mesmo e acertar essas beiradas.

Segundo o amigo Steve sugeriu abaixo, fui procurar sobre schemas, mas me 
deparei com o problema da compatibilidade do codigo que eu já tenho rodando no 
momento. Se eu fisesse uso de varios schemas para apenas 1 banco, colocando 1 
schema para cada um dos bancos antigos nesse novo banco, eu teria o problema de 
reescrever todo o código que existe nesses sistemas legados (reconstruir os 
selects para fazer uso dos schemas), e isso não é uma opcao pra mim. Existe 
alguma outra maneira usando schemas que eu não esteja vendo? Algo sem ter que 
reescrever os selects, inserts e afins...?

Outros 2 amigos, o Euler Taveira e o Flavio Brito, me pediram pra tentar 
exemplificar mais... Vou tentar faze-lo.

Hoje eu tenho 2 sistemas distintos, jah existentes em que foi necessario uma 
integracao.

Como eu fiz: eu fiz dentro de um banco algumas views usando o dblink, e 
apontado para a tabela no outro banco.

Exemplo da view:        
CREATE OR REPLACE VIEW clientes AS 
SELECT clientes.mneu_cli, clientes.nome_cli
  FROM dblink('dbname=sbd95_teste'::text, 'select * from clientes'::text) 
clientes(mneu_cli character varying(4), nome_cli character);

O grande problema eh que 2 dessas tabelas incluidas nas views tem uma 
quantidade grande de tuplas (cerca de 800 mil) e o processo de join de uma 
tabela do banco atual com a view do outro banco esta deveras demorado.

vou colocar um exemplo de uma query, e o seu explain... Pra voces terem uma 
ideia, as views com o dblink são: files e clientes, clientes eh pequena, cerca 
de mil tuplas, já a tabela files tem cerca de 55 mil tuplas.

SELECT *
FROM files  LEFT OUTER JOIN clientes ON clientes.mneu_cli = files.mneu_cli 
LEFT OUTER JOIN recebimentoFiles  ON  files.file = Recebimentofiles.file
LEFT OUTER JOIN recebimento ON  Recebimento.pkRecebimento = 
recebimentoFiles.fkRecebimento
INNER JOIN empresa ON clientes.logo = empresa.logo
INNER JOIN empresa_conta ON empresa.pk_empresa = empresa_conta.fk_empresa

"Nested Loop  (cost=2375.11..31523.83 rows=252 width=4410)"
"  Join Filter: ("outer".logo = ("inner".logo)::numeric)"
"  ->  Nested Loop Left Join  (cost=2370.03..30257.54 rows=6306 width=4004)"
"        ->  Hash Left Join  (cost=2370.03..11175.59 rows=6306 width=3817)"
"              Hash Cond: (("outer".file)::text = ("inner".file)::text)"
"              ->  Hash Join  (cost=15.00..330.00 rows=5000 width=3721)"
"                    Hash Cond: (("outer".mneu_cli)::text = 
("inner".mneu_cli)::text)"
"                    ->  Function Scan on dblink clientes  (cost=0.00..12.50 
rows=1000 width=3027)"
"                    ->  Hash  (cost=12.50..12.50 rows=1000 width=694)"
"                          ->  Function Scan on dblink files  (cost=0.00..12.50 
rows=1000 width=694)"
"              ->  Hash  (cost=1646.62..1646.62 rows=40162 width=96)"
"                    ->  Seq Scan on recebimentofiles  (cost=0.00..1646.62 
rows=40162 width=96)"
"        ->  Index Scan using recebimento_pkrecebimento on recebimento  
(cost=0.00..3.01 rows=1 width=187)"
"              Index Cond: (recebimento.pkrecebimento = "outer".fkrecebimento)"
"  ->  Materialize  (cost=5.09..5.17 rows=8 width=406)"
"        ->  Hash Join  (cost=1.10..5.08 rows=8 width=406)"
"              Hash Cond: ("outer".fk_empresa = "inner".pk_empresa)"
"              ->  Seq Scan on empresa_conta  (cost=0.00..3.60 rows=60 
width=106)"
"              ->  Hash  (cost=1.08..1.08 rows=8 width=300)"
"                    ->  Seq Scan on empresa  (cost=0.00..1.08 rows=8 
width=300)"


        Agradeço qualquer luz que voces possam me dar sobre esse problema de 
selecionar valores em um modelo cross table.

        Desde já peço desculpas pelo email comprido.

        Abracos
        Marcelo Magno



-----Mensagem original-----
De: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] Em nome de Steve Howe
Enviada em: quarta-feira, 9 de agosto de 2006 12:06
Para: [EMAIL PROTECTED]
Assunto: Re: [postgresql-br] Views com dblink

Hello Marcelo,

>       Tenho 2 bancos distintos em um servidor posrgresql 8.1.4 em que me 
> surgiu a necessidade de usar tabelas de um banco juntamente com 
> tabelas do outro banco.
>
>       Minha primeira ideia foi fazer views usando o dblink. Beleza, funciona.
> Mas como essas tabelas são extensas (muitas tuplas) e pela lentidão 
> dada pelo join de uma tabela com uma views (no analyse esse eh o maior 
> custo), eu estou tendendo a acreditar que ele não esteja nem ligando 
> para os indices.
>
>       Existe alguma alternativa diferente de atacar esse problema ? Existe 
> alguma forma de fazer uso dos indices da tabela que esta no outro banco?
Tente incluir o segundo banco num novo schema dentro do primeiro banco.

--
Best Regards,
Steve Howe


--
Grupo PostgreSQL Brasil. Fundado em 1999.
Mensagens para: [EMAIL PROTECTED]
Historico: http://br.groups.yahoo.com/group/postgresql-br/messages
Moderadores: Ismael Amorim, Leonardo Cezar.
 
Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
    http://br.groups.yahoo.com/group/postgresql-br/

<*> Para sair deste grupo, envie um e-mail para:
    [EMAIL PROTECTED]

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
    http://br.yahoo.com/info/utos.html

 


_______________________________________________
Grupo de Usuários do PostgreSQL no Brasil
Antes de perguntar consulte o manual
http://pgdocptbr.sourceforge.net/

Para editar suas opções ou sair da lista acesse a página da lista em:
http://pgfoundry.org/mailman/listinfo/brasil-usuarios

Responder a