Subject | Bad join plan in 2.0.1, why? |
---|---|
Author | Jorge Andres Brugger |
Post date | 2007-06-27T17:49:45Z |
Hi all!
Two tables:
CREATE TABLE FACTURAS (
SUCURSAL D_CODIGO_SUCURSAL NOT NULL /*
D_CODIGO_SUCURSAL = SMALLINT */,
ID_FACTURA INTEGER NOT NULL,
FECHA D_FECHA /* D_FECHA = DATE */,
ANULADA INTEGER DEFAULT 0 NOT NULL
);
ALTER TABLE FACTURAS ADD CONSTRAINT PK_FACTURAS PRIMARY KEY (SUCURSAL,
ID_FACTURA);
CREATE TABLE ITEMS_FACTURAS (
SUCURSAL D_CODIGO_SUCURSAL NOT NULL /*
D_CODIGO_SUCURSAL = SMALLINT */,
ID_FACTURA INTEGER NOT NULL,
NUMERO_ITEM SMALLINT NOT NULL,
CODIGO_PRODUCTO D_CODIGO_PRODUCTO NOT NULL /*
D_CODIGO_PRODUCTO = INTEGER NOT NULL CHECK (value between 1 and 999999) */,
CANTIDAD SMALLINT NOT NULL
);
ALTER TABLE ITEMS_FACTURAS ADD CONSTRAINT PK_ITEMS_FACTURAS PRIMARY KEY
(SUCURSAL, ID_FACTURA, NUMERO_ITEM);
ALTER TABLE ITEMS_FACTURAS ADD CONSTRAINT FK_ITEMS_FACTURAS FOREIGN KEY
(SUCURSAL, ID_FACTURA) REFERENCES FACTURAS (SUCURSAL, ID_FACTURA) ON UPDATE
CASCADE;
Now I want to create a View:
CREATE VIEW VW_ITEMS_FACTURAS_NO_ANULADAS(
SUCURSAL,
ID_FACTURA,
FECHA,
NUMERO_ITEM,
CODIGO_PRODUCTO,
CANTIDAD)
AS
SELECT FACTURAS.SUCURSAL, FACTURAS.ID_FACTURA, FACTURAS.FECHA,
ITEMS_FACTURAS.NUMERO_ITEM, ITEMS_FACTURAS.CODIGO_PRODUCTO,
ITEMS_FACTURAS.CANTIDAD
FROM FACTURAS INNER JOIN ITEMS_FACTURAS ON (FACTURAS.SUCURSAL =
ITEMS_FACTURAS.SUCURSAL) and (FACTURAS.ID_FACTURA =
ITEMS_FACTURAS.ID_FACTURA)
where facturas.anulada = 0;
Plan for this view is:
PLAN JOIN (FACTURAS NATURAL, ITEMS_FACTURAS INDEX (FK_ITEMS_FACTURAS))
¿Why facturas plan is natural is there is a PK with the components used in
join?
¿Is there a way to "fix" this?
Thanks!
[Non-text portions of this message have been removed]
Two tables:
CREATE TABLE FACTURAS (
SUCURSAL D_CODIGO_SUCURSAL NOT NULL /*
D_CODIGO_SUCURSAL = SMALLINT */,
ID_FACTURA INTEGER NOT NULL,
FECHA D_FECHA /* D_FECHA = DATE */,
ANULADA INTEGER DEFAULT 0 NOT NULL
);
ALTER TABLE FACTURAS ADD CONSTRAINT PK_FACTURAS PRIMARY KEY (SUCURSAL,
ID_FACTURA);
CREATE TABLE ITEMS_FACTURAS (
SUCURSAL D_CODIGO_SUCURSAL NOT NULL /*
D_CODIGO_SUCURSAL = SMALLINT */,
ID_FACTURA INTEGER NOT NULL,
NUMERO_ITEM SMALLINT NOT NULL,
CODIGO_PRODUCTO D_CODIGO_PRODUCTO NOT NULL /*
D_CODIGO_PRODUCTO = INTEGER NOT NULL CHECK (value between 1 and 999999) */,
CANTIDAD SMALLINT NOT NULL
);
ALTER TABLE ITEMS_FACTURAS ADD CONSTRAINT PK_ITEMS_FACTURAS PRIMARY KEY
(SUCURSAL, ID_FACTURA, NUMERO_ITEM);
ALTER TABLE ITEMS_FACTURAS ADD CONSTRAINT FK_ITEMS_FACTURAS FOREIGN KEY
(SUCURSAL, ID_FACTURA) REFERENCES FACTURAS (SUCURSAL, ID_FACTURA) ON UPDATE
CASCADE;
Now I want to create a View:
CREATE VIEW VW_ITEMS_FACTURAS_NO_ANULADAS(
SUCURSAL,
ID_FACTURA,
FECHA,
NUMERO_ITEM,
CODIGO_PRODUCTO,
CANTIDAD)
AS
SELECT FACTURAS.SUCURSAL, FACTURAS.ID_FACTURA, FACTURAS.FECHA,
ITEMS_FACTURAS.NUMERO_ITEM, ITEMS_FACTURAS.CODIGO_PRODUCTO,
ITEMS_FACTURAS.CANTIDAD
FROM FACTURAS INNER JOIN ITEMS_FACTURAS ON (FACTURAS.SUCURSAL =
ITEMS_FACTURAS.SUCURSAL) and (FACTURAS.ID_FACTURA =
ITEMS_FACTURAS.ID_FACTURA)
where facturas.anulada = 0;
Plan for this view is:
PLAN JOIN (FACTURAS NATURAL, ITEMS_FACTURAS INDEX (FK_ITEMS_FACTURAS))
¿Why facturas plan is natural is there is a PK with the components used in
join?
¿Is there a way to "fix" this?
Thanks!
[Non-text portions of this message have been removed]