Я опять здесь. Урожайный у меня день сегодня И так 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);