|
Есть ли у нас ПЛАН, мистер Фикс?
|
|||
---|---|---|---|
#18+
1. дисклеймер. обход проблемы известен. ищу способы превентивного недопущения. 2.5.8 2. Неверно строится план в случае практически всегда отсутствующего значения поля. Исходные с объекта: все поля ID - первичные ключи все поля, начинающиеся с ID_ - ссылки на другие таблицы, ессно с foreign key параметр ID_TR - любое не null число, поле ID_TR_BON в 99.99% случаев - null, остальные значения уникальны в таблице SALE$ACC_TR_LINK из 821988 записей 1 не null. select count(*) from SALE$ACC_TR_LINK sl where sl.ID_TR_BON is not null COUNT 1 типовой запрос Query ------------------------------------------------ select * from SALE$ACC_TR_LINK sl join SALE$DOC_ITEM_BPS dib on dib.ID_SDI = sl.ID_SDI join BILL$POSITIONS bps on dib.ID_BPS = bps.ID where sl.ID_TR_BON = :ID_TR Plan ------------------------------------------------ PLAN JOIN (DIB NATURAL, BPS INDEX (BILL$POSITIONS), SL INDEX (SALE$ACC_TR_LINK_SDI)) Query Time ------------------------------------------------ Prepare : 31,00 ms Execute : 12 870,00 ms Avg fetch time: 0,00 ms Operations ------------------------------------------------ Read : 30 315 Writes : 0 Fetches: 18 684 568 Marks : 0 Enchanced Info: Table Name Indexed | Non-Indexed BILL$POSITIONS 1547919 0 SALE$ACC_TR_LINK 821988 0 SALE$DOC_ITEM_BPS 0 1547919 индексы, статистика свежесобрана : SALE$ACC_TR_LINK_TRB 0.5 остальные связки вот такого порядка. SALE$ACC_TR_LINK_SDI 0.00000121.. пока живем вот так: Query ------------------------------------------------ select * from SALE$ACC_TR_LINK sl join SALE$DOC_ITEM_BPS dib on dib.ID_SDI = sl.ID_SDI+0 join BILL$POSITIONS bps on dib.ID_BPS = bps.ID where sl.ID_TR_BON = :ID_TR Plan ------------------------------------------------ PLAN JOIN (SL INDEX (SALE$ACC_TR_LINK_TRB), DIB INDEX (SALE$DOC_ITEM_BPS_SDI), BPS INDEX (BILL$POSITIONS)) Query Time ------------------------------------------------ Prepare : 31,00 ms Execute : 31,00 ms Avg fetch time: 0,00 ms Operations ------------------------------------------------ Read : 2 Writes : 0 Fetches: 12 Marks : 0 Enchanced Info: Table Name Indexed | Non-Indexed - - - попытки воспроизвести на 1000000 оказались неудачны set term ^ ; set SQL dialect 3^ create database 'c:\temp\test.fdb' user 'SYSDBA' password 'masterkey' page_size 4096^ create domain PK bigint not null^ create domain REF bigint^ create domain TEXT varchar(100) ^ create table MASTER( ID PK, TEXT TEXT, constraint MASTER primary key(ID) ) ^ create table SLAVE( ID PK, LINK REF, TEXT TEXT, constraint SLAVE primary key(ID), constraint SLAVE_LINK foreign key (LINK) references MASTER(ID) ) ^ create table REF( ID PK, TEXT TEXT, constraint REF primary key(ID) ) ^ create table DOUBLE_SLAVE( ID PK, LINK REF, REF1 REF, -- another master reference almost never null REF2 REF, -- another master reference almost always null TEXT TEXT, constraint DOUBLE_SLAVE primary key(ID), constraint DOUBLE_SLAVE_LINK foreign key (LINK) references MASTER(ID), constraint DOUBLE_SLAVE_REF1 foreign key (REF1) references REF(ID), constraint DOUBLE_SLAVE_REF2 foreign key (REF2) references REF(ID) ) ^ execute block as declare i bigint; begin i = 0; while (i < 1000000) do begin insert into MASTER(ID, TEXT) values (:i, :i); insert into REF(ID, TEXT) values (:i, :i); insert into SLAVE(ID, LINK, TEXT) values (:i, :i, :i); insert into DOUBLE_SLAVE(ID, TEXT, LINK, REF1) values (:i, :i, :i, :i); i = i + 1; end update DOUBLE_SLAVE set REF2 = 100000 where ID = 100000; end ^ set statistics INDEX MASTER^ set statistics INDEX SLAVE_LINK^ set statistics INDEX DOUBLE_SLAVE_REF1^ set statistics INDEX DOUBLE_SLAVE_REF2^ Query ------------------------------------------------ select * from DOUBLE_SLAVE ds join MASTER m on ds.LINK = m.ID join SLAVE s on s.LINK = m.ID where ds.REF2 = :REF Plan ------------------------------------------------ PLAN JOIN (DS INDEX (DOUBLE_SLAVE_REF2), M INDEX (MASTER), S INDEX (SLAVE_LINK)) Operations ------------------------------------------------ Read : 0 Writes : 0 Fetches: 13 Marks : 0 Query ------------------------------------------------ select * from DOUBLE_SLAVE ds join MASTER m on ds.LINK = m.ID join SLAVE s on s.LINK = m.ID where ds.REF1 = :REF Plan ------------------------------------------------ PLAN JOIN (DS INDEX (DOUBLE_SLAVE_REF1), M INDEX (MASTER), S INDEX (SLAVE_LINK)) Operations ------------------------------------------------ Read : 8 Writes : 0 Fetches: 27 Marks : 0 Enchanced Info: Table Name Indexed Non-Indexed DOUBLE_SLAVE 1 0 MASTER 1 0 SLAVE 1 0 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2019, 11:16 |
|
|
start [/forum/topic.php?fid=40&fpage=18&tid=1560501]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
52ms |
get topic data: |
14ms |
get forum data: |
2ms |
get page messages: |
36ms |
get tp. blocked users: |
2ms |
others: | 16ms |
total: | 153ms |
0 / 0 |