[firebase-br] PLAN natural, porque?
omar l m rosa
omarrosa em terra.com.br
Sex Jan 26 20:14:07 -03 2007
HI!
Não consegui reproduzir, pois instalei ao FB 2.01 hoje!!!!!/////\\\\\!!!!!
Mas mesmo nas condições não aconteceu mais.... logo.... acho que era um
inseto!
Bai!
----- Original Message -----
From: "Henrique Netzka (Vetor Sistemas)" <henrique em vetorsistemas.com.br>
To: "FireBase" <lista em firebase.com.br>
Sent: Friday, January 26, 2007 9:14 AM
Subject: Re: [firebase-br] PLAN natural, porque?
Ei, omar, acabei de reparar uma coisa!
A tabela Merc_estoques não tem uma FK com a Mercadorias? Ok, agora vc
removeu todos os FKs, mas antes não tinha??
Pq se não tinha, isso pode "atrapalhar" o otimizador... A msm coisa acontece
se você ligar Pedidos à Mercadorias; não há FK nela, ele não tem certeza o
que pode fazer ali... Talvez só criando a FK entre Merc_Estoques e
Mercadorias já resolvesse...
abraços
----- Original Message -----
From: "omar l m rosa" <omarrosa em terra.com.br>
To: "Carlos H. Cantu" <listas em warmboot.com.br>; "FireBase"
<lista em firebase.com.br>
Sent: Wednesday, January 24, 2007 3:34 PM
Subject: Re: [firebase-br] PLAN natural, porque?
Fiz dois testes
1) substitui por join - tudo igual
2) substitui um relacionamento para ficar tudo apontando p/ tabela do
select - perdeu o indice da tabela usuarios!!!
3) DDL das tabelas envolvidas
(Uso fb.2.0 vou ver com o fb 1.5)
>>>>>>>>>>>>>>>>>>>>>>>*******************************<<<<<<<<<<<<<<<<<<<<<<
<<<<
primeiro teste: substitui por join ( mesmo resultado)
-----------------------------------------------------
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 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)
/*-----------------------------------------------------===E.================
====== <<<<<<<<<<<<<<*/
join USUARIOS U on (P.PK_USUARIOS = U.PK_USUARIOS)
where 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)))
>>>>>>>>>>>>>>>>>>****************************<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
<<<<<<<
>>>>>>>>>>>>>>>>>>****************************<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
<<<<<<<
segundo teste: (alterei join MERCADORIAS M on (M.PK_MERCADORIAS =
P.PK_MERCADORIAS)
==P.==============-<<<<<<<<<<<<<<<<<<
ou seja todos os joins apontam para a tabela do select
?? perdeu o indice de usuarios "U NATURAL"
----------------------------------------------------------
Plan
PLAN SORT (JOIN (U NATURAL, P INDEX (FK_PEDIDOS_MERC_2), M INDEX
(PK_MERCADORIAS), E INDEX
==================
(PK_MERC_ESTOQUES)))
Adapted Plan
PLAN SORT (JOIN (U NATURAL, P INDEX (FK_PEDIDOS_MERC_2), M INDEX
(PK_MERCADORIAS), E INDEX (PK_MERC_ESTOQUES)))
>>>>>>>>>>>>>>>>>>****************************<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
<<<<<<<
>>>>>>>>>>>>>>>>>>****************************<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
<<<<<<<
>>>>>>>>>>>>>>>>>>****************************<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
<<<<<<<
DDL das tabelas envolvidas:
===========================
SET SQL DIALECT 3;
SET NAMES WIN1252;
CREATE TABLE MERCADORIAS (
PK_MERCADORIAS INTEGER NOT NULL,
CODIGO VARCHAR(40) COLLATE WIN_PTBR,
DESCRICAO VARCHAR(100) COLLATE WIN_PTBR,
);
ALTER TABLE MERCADORIAS ADD CONSTRAINT PK_MERCADORIAS PRIMARY KEY
(PK_MERCADORIAS);
CREATE UNIQUE INDEX MERCADORIAS_IDX1 ON MERCADORIAS (CODIGO);
==================================
CREATE TABLE PEDIDOS_MERC (
PK_PEDIDOS_MERC INTEGER NOT NULL,
PK_PEDIDOS INTEGER,
PK_MERC_ESTOQUES INTEGER,
QUANTIDADE NUMERIC(10,2),
PRECO_UNITARIO DECIMAL(15,2),
DESCONTO DECIMAL(15,2),
DATA TIMESTAMP,
PK_USUARIOS INTEGER,
PK_HISTORICOS INTEGER,
TABELA_PRECOS TIMESTAMP,
ESTOQUE_ANT NUMERIC(10,2),
CODIGO_PEDIDO VARCHAR(40) COLLATE WIN_PTBR,
STATUS SMALLINT,
POSICAO_PECA VARCHAR(10) COLLATE WIN_PTBR,
PK_MERCADORIAS INTEGER,
DESCRICAO_PEDIDO VARCHAR(100),
OPCAO_PEDIDO SMALLINT
);
ALTER TABLE PEDIDOS_MERC ADD CONSTRAINT CHK1_PEDIDOS_MERC CHECK(QUANTIDADE >
0);
ALTER TABLE PEDIDOS_MERC ADD CONSTRAINT CHK2_PEDIDOS_MERC
CHECK(PRECO_UNITARIO > 0);
ALTER TABLE PEDIDOS_MERC ADD CONSTRAINT PK_PEDIDOS_MERC PRIMARY KEY
(PK_PEDIDOS_MERC);
ALTER TABLE PEDIDOS_MERC ADD CONSTRAINT FK_PEDIDOS_MERC_1 FOREIGN KEY
(PK_MERC_ESTOQUES) REFERENCES MERC_ESTOQUES (PK_MERC_ESTOQUES);
ALTER TABLE PEDIDOS_MERC ADD CONSTRAINT FK_PEDIDOS_MERC_2 FOREIGN KEY
(PK_USUARIOS) REFERENCES USUARIOS (PK_USUARIOS);
===========================================
CREATE TABLE MERC_ESTOQUES (
PK_MERC_ESTOQUES INTEGER NOT NULL,
PK_TB_ESTOQUES INTEGER,
PK_MERCADORIAS INTEGER,
QUANTIDADE NUMERIC(10,2),
LOCALIZACAO VARCHAR(20) COLLATE WIN_PTBR,
ULTIMA_ENTRADA TIMESTAMP,
ULTIMA_SAIDA TIMESTAMP,
PK_USUARIOS_ENT INTEGER,
PK_USUARIOS_SAI INTEGER,
PK_MERC_INVENTARIO INTEGER,
STATUS SMALLINT,
QTD_PEDIDAS NUMERIC(10,2)
);
ALTER TABLE MERC_ESTOQUES ADD CONSTRAINT PK_MERC_ESTOQUES PRIMARY KEY
(PK_MERC_ESTOQUES);
CREATE INDEX I_MERC_ESTOQUES_1 ON MERC_ESTOQUES (PK_MERCADORIAS);
=============================
CREATE TABLE USUARIOS (
PK_USUARIOS INTEGER NOT NULL,
NOME VARCHAR(50) COLLATE WIN_PTBR,
);
ALTER TABLE USUARIOS ADD CONSTRAINT PK_USUARIOS PRIMARY KEY (PK_USUARIOS);
=============================
----- Original Message -----
From: "Carlos H. Cantu (TeamFB)" <listas em warmboot.com.br>
To: "FireBase" <lista em firebase.com.br>
Sent: Wednesday, January 24, 2007 11:42 AM
Subject: Re: [firebase-br] PLAN natural, porque?
O fato de vc não estar usando a sintaxe do SQL92 pode estar
prejudicando o optimizador... substitua o WHERE por JOINs e veja se
ele altera o plano.
PS: Muitas variáveis influem da decisão do otimizador de usar um
índice ou não... geralmente ele acerta, mas nem sempre. Pode ser o seu
caso.
[]s
Cantu (Membro do TeamFB - FireBase)
http://www.warmboot.com.br
FireBase - http://www.FireBase.com.br
olmr> O select abaixo está me retornando um plano extranho, pois todas as
colunas
olmr> do where são primary keys, portanto indexadas, e logo ma tabela
mercadorias
olmr> que é a maior!!!!
olmr> (fb 2.0)
olmr> -----------
olmr> select m.pk_mercadorias,
olmr> m.codigo,
olmr> p.status,
olmr> P.CODIGO_PEDIDO,
olmr> m.descricao,
olmr> p.quantidade,
olmr> p.preco_unitario,
olmr> p.desconto,
olmr> e.localizacao,
olmr> u.nome,
olmr> p.pk_pedidos,
olmr> p.pk_pedidos_merc,
olmr> p.pk_usuarios,
olmr> p.pk_merc_estoques,
olmr> p.data,
olmr> p.TABELA_PRECOS,
olmr> p.quantidade * p.preco_unitario
olmr> from mercadorias m, pedidos_merc p, usuarios u, merc_estoques e
olmr> where m.pk_mercadorias = e.pk_mercadorias and
olmr> p.pk_merc_estoques = e.pk_merc_estoques and
olmr> p.pk_usuarios = u.pk_usuarios
olmr> ;
olmr> ----------------
olmr> Plan
olmr> PLAN JOIN (M NATURAL, E INDEX (I_MERC_ESTOQUES_1), P INDEX
olmr> (FK_PEDIDOS_MERC_1), U INDEX (PK_USUARIOS))
olmr> Adapted Plan
olmr> PLAN JOIN (M NATURAL, E INDEX (I_MERC_ESTOQUES_1), P INDEX
olmr> (FK_PEDIDOS_MERC_1), U INDEX (PK_USUARIOS))
olmr> ______________________________________________
olmr> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
olmr> Para editar sua configuração na lista, use o endereço
olmr> http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
olmr> 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
______________________________________________
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