Я опять здесь.
Урожайный у меня день сегодня
И так FB 2.0

есть запрос

select d.id, i.name
from docdet d
left join item i on i.id = d.id_item
where d.ID_DOC = :mas_id and d.i2 is null

Я пользуюсь FIB, довольно старой
версией.
Естественно, установленно Option.poNoForceIsNull
= false
т.е. запрос при MAS_ID = null
преобразовывается к виду

select d.id, i.name
from docdet d
left join item i on i.id = d.id_item
where d.ID_DOC is null and d.i2 is null
PLAN JOIN (D NATURAL, I INDEX (PK_ITEM))


Зачем мне этот парамет нужен, не знаю,
точнее но мне не нужен, но он есть.

если я меняю местами выражения в "where"

select d.id, i.name
from docdet d
left join item i on i.id = d.id_item
where d.i2 is null and d.ID_DOC is null

то получаю совсем другой план

PLAN JOIN (D INDEX (FK_DOCDET), I INDEX (PK_ITEM))

Т.е. от перемены мест слагаемых сумма
меняется?

Свои ошибки уже исправил, но осадок...

Про таблицы

ITEM (150)
    Primary pointer page: 195, Index root page: 196
    Average record length: 85.77, total records: 8511
    Average version length: 0.00, total versions: 0, max versions: 0
    Data pages: 133, data page slots: 133, average fill: 81%
    Fill distribution:
         0 - 19% = 0
        20 - 39% = 1
        40 - 59% = 0
        60 - 79% = 4
        80 - 99% = 128

    Index ITEM_IDX1 (1)
        Depth: 2, leaf buckets: 5, nodes: 8511
        Average data length: 0.19, total dup: 6992, max dup: 92
        Fill distribution:
             0 - 19% = 0
            20 - 39% = 1
            40 - 59% = 0
            60 - 79% = 0
            80 - 99% = 4

    Index ITEM_ITEM (0)
        Depth: 2, leaf buckets: 5, nodes: 8511
        Average data length: 0.29, total dup: 6926, max dup: 253
        Fill distribution:
             0 - 19% = 0
            20 - 39% = 0
            40 - 59% = 1
            60 - 79% = 0
            80 - 99% = 4

    Index PK_ITEM (2)
        Depth: 2, leaf buckets: 7, nodes: 8511
        Average data length: 1.64, total dup: 0, max dup: 0
        Fill distribution:
             0 - 19% = 0
            20 - 39% = 0
            40 - 59% = 1
            60 - 79% = 0
            80 - 99% = 6

DOCDET (160)
    Primary pointer page: 217, Index root page: 218
    Average record length: 63.26, total records: 1928535
    Average version length: 0.00, total versions: 0, max versions: 0
    Data pages: 24766, data page slots: 24767, average fill: 77%
    Fill distribution:
         0 - 19% = 81
        20 - 39% = 0
        40 - 59% = 2
        60 - 79% = 24683
        80 - 99% = 0

    Index DOCDET_IDX1 (1)
        Depth: 3, leaf buckets: 1491, nodes: 1928535
        Average data length: 0.44, total dup: 1139222, max dup: 113325
        Fill distribution:
             0 - 19% = 0
            20 - 39% = 0
            40 - 59% = 421
            60 - 79% = 0
            80 - 99% = 1070

    Index FK_DOCDET (2)
        Depth: 3, leaf buckets: 1198, nodes: 1928535
        Average data length: 0.03, total dup: 1898510, max dup: 23012
        Fill distribution:
             0 - 19% = 0
            20 - 39% = 1
            40 - 59% = 3
            60 - 79% = 2
            80 - 99% = 1192

    Index PK_DOCDET (0)
        Depth: 3, leaf buckets: 1439, nodes: 1928535
        Average data length: 1.03, total dup: 0, max dup: 0
        Fill distribution:
             0 - 19% = 1
            20 - 39% = 0
            40 - 59% = 2
            60 - 79% = 1
            80 - 99% = 1435

CREATE TABLE DOCDET (
    ID              DID /* DID = INTEGER NOT NULL */,
    ID_DOC          DID /* DID = INTEGER NOT NULL */,
    ID_ITEM         DID NOT NULL /* DID = INTEGER NOT NULL */,
    ITEM_COUNT      DINT /* DINT = INTEGER */,
    ITEMS           DCOUNT /* DCOUNT = NUMERIC(9,2) */,
    PRICE           DCURRENCY /* DCURRENCY = NUMERIC(9,2) */,
    ITEM_COUNT_ALT  DINT /* DINT = INTEGER */,
    ITEMS_ALT       DCOUNT /* DCOUNT = NUMERIC(9,2) */,
    COMMENT         DSTRINGN COLLATE WIN1251_UA /* DSTRINGN =
VARCHAR(50) DEFAULT '' */,
    ID_BARCODE      DINT /* DINT = INTEGER */,
    SYSDAY          DSYSDATE /* DSYSDATE = TIMESTAMP DEFAULT
CURRENT_TIMESTAMP */,
    SYSUSER         DSYSUSER /* DSYSUSER = VARCHAR(12) DEFAULT
CURRENT_USER */,
    SYSREGION       DSYSREGION /* DSYSREGION = INTEGER DEFAULT 1 */,
    I1              DINT /* DINT = INTEGER */,
    I2              DINT /* DINT = INTEGER */,
    I3              DINT /* DINT = INTEGER */,
    I4              DINT /* DINT = INTEGER */,
    D1              DDOUBLE /* DDOUBLE = DOUBLE PRECISION */,
    N1              DCURRENCY4 /* DCURRENCY4 = NUMERIC(12,4) */
);

ALTER TABLE DOCDET ADD CONSTRAINT PK_DOCDET PRIMARY KEY (ID);
ALTER TABLE DOCDET ADD CONSTRAINT FK_DOCDET FOREIGN KEY (ID_DOC)
REFERENCES DOC (ID) ON DELETE CASCADE;
CREATE INDEX DOCDET_IDX1 ON DOCDET (ID_BARCODE);

CREATE TABLE ITEM (
    ID          DID NOT NULL /* DID = INTEGER NOT NULL */,
    ID_ITEM     DINT default 0 /* DINT = INTEGER */,
    ITEM_TYPE   DINT /* DINT = INTEGER */,
    CODE        DINT /* DINT = INTEGER */,
    NAME        DSTRING /* DSTRING = VARCHAR(84) DEFAULT '' NOT NULL
*/,
    PRINTNAME   DSTRING84N COLLATE WIN1251_UA /* DSTRING84N =
VARCHAR(84) DEFAULT '' */,
    ID_IZM      DSHORT /* DSHORT = SMALLINT DEFAULT 1 */,
    IZM_VALUE   DCOUNT /* DCOUNT = NUMERIC(9,2) */,
    INPACK      DINT /* DINT = INTEGER */,
    VISIBLE     DVISIBLE /* DVISIBLE = SMALLINT DEFAULT 1 NOT NULL */,
    ORDR        DINT /* DINT = INTEGER */,
    PRICE       DCURRENCY0 /* DCURRENCY0 = NUMERIC(9,2) DEFAULT 0 */,
    CODE_ALT    DINT /* DINT = INTEGER */,
    CODE_MIN    DINT /* DINT = INTEGER */,
    CODE_MAX    DINT /* DINT = INTEGER */,
    SYSDAY      DSYSDATE /* DSYSDATE = TIMESTAMP DEFAULT
CURRENT_TIMESTAMP */,
    SYSUSER     DSYSUSER /* DSYSUSER = VARCHAR(12) DEFAULT CURRENT_USER
*/,
    SYSREGION   DSYSREGION /* DSYSREGION = INTEGER DEFAULT 1 */,
    PP_COMMENT  DSTRING30N COLLATE WIN1251_UA /* DSTRING30N =
VARCHAR(30) DEFAULT '' */,
    MAIN_CODE   DINT /* DINT = INTEGER */,
    VSTAVKA     DINT /* DINT = INTEGER */,
    ID_COLOR    DINT /* DINT = INTEGER */
);

ALTER TABLE ITEM ADD CONSTRAINT PK_ITEM PRIMARY KEY (ID);

CREATE INDEX ITEM_IDX1 ON ITEM (CODE);
CREATE INDEX ITEM_ITEM ON ITEM (ID_ITEM);

Ответить