[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