[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