[firebase-br] PLAN natural, porque?

Henrique Netzka (Vetor Sistemas) henrique em vetorsistemas.com.br
Qua Jan 24 11:44:31 -03 2007


Ah, agora fez mais sentido a sua preocupação! Ou revolta hehehe...

Bem... falando um pouco de bancos de dados em geral... Contar com o 
otimizador é sempre um risco! Ele pode ser bom, mas pode se perder muito 
também...

A primeira coisa que posso te sugerir é em relação à ordem das tabelas no 
WHERE. Experimente modificá-la, colocando a tabela Pedidos_Merc (que é a 
filtrada!!) por primeiro e depois as outras. Se não resolver, você pode 
tentar mudar o estilo do JOIN; eventualmente a sintaxe fará diferente, então 
talvez resolva torná-lo assim:

from
  PEDIDOS_MERC P
  JOIN MERC_ESTOQUES E ON P.PK_MERC_ESTOQUES = E.PK_MERC_ESTOQUES
  JOIN MERCADORIAS M ON M.PK_MERCADORIAS = E.PK_MERCADORIAS
  JOIN USUARIOS U ON P.PK_USUARIOS = U.PK_USUARIOS
where
      P.PK_PEDIDOS = :APK_PEDIDOS
order by PK_PEDIDOS_MERC

Caso isso ainda não resolva, vc pode tornar o join Mercadorias como LEFT 
JOIN; isso fará com que, definitivamente, ele não mande em nada! Porém, é 
claro, você "cria margem" para um resultado diferente do que você atualmente 
busca; se você conseguir garantir que sempre haverá dados na tabela 
MERCADORIAS (ou seja, se o LEFT JOIN não irá retornar nada nulo) você pode 
usar isso sem qualquer problema!

from
  PEDIDOS_MERC P
  JOIN MERC_ESTOQUES E ON P.PK_MERC_ESTOQUES = E.PK_MERC_ESTOQUES
  LEFT JOIN MERCADORIAS M ON M.PK_MERCADORIAS = E.PK_MERCADORIAS
  JOIN USUARIOS U ON P.PK_USUARIOS = U.PK_USUARIOS
where
      P.PK_PEDIDOS = :APK_PEDIDOS
order by PK_PEDIDOS_MERC

Testa aí e manda a resposta! rs
Henrique



----- Original Message ----- 
From: "omar l m rosa" <omarrosa em terra.com.br>
To: "FireBase" <lista em firebase.com.br>
Sent: Wednesday, January 24, 2007 12:13 PM
Subject: Re: [firebase-br] PLAN natural, porque?


O exemplo foi furado!!!
Eis novamente, agora completo: ( fb2.0)

pedidos_merc -> merc_estoques -> mercadorias

Colei no IbExpert e dei um prepare;

select M.PK_MERCADORIAS,
       M.CODIGO,
       P.STATUS,
       P.CODIGO_PEDIDO,
       M.DESCRICAO,
       P.QUANTIDADE,
       P.PRECO_UNITARIO,
       P.DESCONTO,
       E.LOCALIZACAO,
       U.NOME,
       P.PK_PEDIDOS,
       P.PK_PEDIDOS_MERC,
       P.PK_USUARIOS,
       P.PK_MERC_ESTOQUES,
       P.DATA,
       P.TABELA_PRECOS,
       P.QUANTIDADE * P.PRECO_UNITARIO
from MERCADORIAS M, PEDIDOS_MERC P, USUARIOS U, MERC_ESTOQUES E
where M.PK_MERCADORIAS = E.PK_MERCADORIAS and
      P.PK_MERC_ESTOQUES = E.PK_MERC_ESTOQUES and
      P.PK_USUARIOS = U.PK_USUARIOS and
      P.PK_PEDIDOS = :APK_PEDIDOS
      order by PK_PEDIDOS_MERC

Plan
PLAN SORT (JOIN (M NATURAL, E INDEX (I_MERC_ESTOQUES_1), P INDEX
(FK_PEDIDOS_MERC_1), U INDEX (PK_USUARIOS)))

Adapted Plan
PLAN SORT (JOIN (M NATURAL, E INDEX (I_MERC_ESTOQUES_1), P INDEX
(FK_PEDIDOS_MERC_1), U INDEX (PK_USUARIOS)))


----- Original Message -----
From: "Henrique Netzka (Vetor Sistemas)" <henrique em vetorsistemas.com.br>
To: "FireBase" <lista em firebase.com.br>
Sent: Wednesday, January 24, 2007 8:31 AM
Subject: Re: [firebase-br] PLAN natural, porque?


Bom dia, Omar!

Mas os indices estão sendo usados!! Porém, você não colocou nenhum filtro na
tabela mercadorias... Logo, ele vai buscar todos os registros desta tabela!
Ou seja, o que ele poderia fazer com o índice da mercadorias se ele vai ter
que buscar todos os registros?!

Abraços,
Henrique Netzka
----- Original Message -----
From: "omar l m rosa" <omarrosa em terra.com.br>
To: "FireBase" <lista em firebase.com.br>
Sent: Wednesday, January 24, 2007 10:02 AM
Subject: [firebase-br] PLAN natural, porque?


O select abaixo está me retornando um plano extranho, pois todas as colunas
do where são primary keys, portanto indexadas, e logo ma tabela mercadorias
que é a maior!!!!
(fb 2.0)
-----------

select m.pk_mercadorias,
m.codigo,
p.status,
P.CODIGO_PEDIDO,
m.descricao,
p.quantidade,
p.preco_unitario,
p.desconto,
e.localizacao,
u.nome,
p.pk_pedidos,
p.pk_pedidos_merc,
p.pk_usuarios,
p.pk_merc_estoques,
p.data,
p.TABELA_PRECOS,
p.quantidade * p.preco_unitario
from mercadorias m, pedidos_merc p, usuarios u, merc_estoques e
where m.pk_mercadorias = e.pk_mercadorias and
      p.pk_merc_estoques = e.pk_merc_estoques and
      p.pk_usuarios = u.pk_usuarios
;
----------------
Plan
PLAN JOIN (M NATURAL, E INDEX (I_MERC_ESTOQUES_1), P INDEX
(FK_PEDIDOS_MERC_1), U INDEX (PK_USUARIOS))

Adapted Plan
PLAN JOIN (M NATURAL, E INDEX (I_MERC_ESTOQUES_1), P INDEX
(FK_PEDIDOS_MERC_1), U INDEX (PK_USUARIOS))


______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.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://firebase.com.br/pesquisa


______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.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://firebase.com.br/pesquisa


______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.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://firebase.com.br/pesquisa 





Mais detalhes sobre a lista de discussão lista