Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Firebird 5 - wrong plan #7681

Open
EPluribusUnum opened this issue Jul 20, 2023 · 5 comments
Open

Firebird 5 - wrong plan #7681

EPluribusUnum opened this issue Jul 20, 2023 · 5 comments
Assignees

Comments

@EPluribusUnum
Copy link

Hi *!

SELECT lit.gl_fk_tetel14_cpy_run_with_ex(15021, 15021, 'KA', null, null, 'N') FROM rdb$database

This call builds this SELECT :

SELECT t.fkisz_id, t.nyitzar, t.ervdat, t.bizonylat, t.szoveg,
t.szla, t.szla2, t.minosit1, t.minosit2, t.minosit3, t.minosit4, t.minosit5, t.minosit6,
t.eszla, t.eszla2, t.eminosit1, t.eminosit2, t.eminosit3, t.eminosit4, t.eminosit5, t.eminosit6,
t.tartozik, t.kovetel, t.mertek, t.megyseg, t.emertek, t.emegyseg, t.dertek, t.dnem, t.edertek, t.ednem,
t.alrkod, t.gytip, t.gysor, t.ugyf_id, t.kod1, t.kod2, t.kod3, t.kod4, t.kod5,
(SELECT ubt.id FROM pu_btet ubt WHERE ubt.pbiz_id = 15021 AND ubt.gysor = bt.gysor)
FROM pu_btet bt
INNER JOIN pu_biz b ON b.id = bt.pbiz_id
LEFT OUTER JOIN fk_buftet t ON t.alrsor = bt.id
WHERE bt.pbiz_id = 15021 AND
t.tabla = IIF(b.igaz = 'F', 'FK_TETEL', 'FK_BUFFER') AND
t.alrsor IS NOT NULL

FB30 plan
PLAN (T EV INDEX (PU_EV_KONYV_FK1))
PLAN (T FK_TETEL INDEX (PU_EV_KONYV_FK2))
PLAN (T FK_BUFFER INDEX (KT_EV_KTBT_FK_FK2, KT_EV_KTBT_FK_FK4, KT_EV_KTBT_FK_FK3, KT_EV_KTBT_FK_FK5))
PLAN (T KP INDEX (KAPENZTAR_FK2))
PLAN (UBT INDEX (PU_BTET_UK))
PLAN JOIN (JOIN (B INDEX (PU_BIZ_PK), BT INDEX (PU_BTET_BIZ_FK)), T FK_BUFFER INDEX (FK_BUFFER_ALRSOR), T FK_TETEL INDEX (FK_TETEL_ALRSOR))

FB40 plan
PLAN (T EV INDEX (PU_EV_KONYV_FK1))
PLAN (T FK_TETEL INDEX (PU_EV_KONYV_FK2))
PLAN (T FK_BUFFER INDEX (KT_EV_KTBT_FK_FK2, KT_EV_KTBT_FK_FK4, KT_EV_KTBT_FK_FK3, KT_EV_KTBT_FK_FK5))
PLAN (T KP INDEX (KAPENZTAR_FK2))
PLAN (UBT INDEX (PU_BTET_UK))
PLAN JOIN (JOIN (B INDEX (PU_BIZ_PK), BT INDEX (PU_BTET_BIZ_FK)), T FK_BUFFER INDEX (FK_BUFFER_ALRSOR), T FK_TETEL INDEX (FK_TETEL_ALRSOR))

FB50 (1121) plan
PLAN (T EV INDEX (PU_EV_KONYV_FK1))
PLAN (T FK_TETEL INDEX (PU_EV_KONYV_FK2))
PLAN (T FK_BUFFER INDEX (KT_EV_KTBT_FK_FK2, KT_EV_KTBT_FK_FK4, KT_EV_KTBT_FK_FK3, KT_EV_KTBT_FK_FK5))
PLAN (T KP INDEX (KAPENZTAR_FK2))
PLAN (UBT INDEX (PU_BTET_UK))
PLAN JOIN (JOIN (T FK_BUFFER NATURAL, T FK_TETEL NATURAL, BT INDEX (PU_BTET_PK)), B INDEX (PU_BIZ_PK))

Also on 50
SELECT lit.gl_fk_tetel14_cpy_run_with_ex(15021, 15021, 'KA', null, null, 'N') FROM rdb$database
sometimes inserts more than 1 record

java.lang.RuntimeException: exception 23; GL_EXCEPTION_EX; 3. könyvelés INSERT a 11/PKEZI/2017 bizonylathoz; At function 'EX.EX' line: 33, col: 5
At trigger 'FK_BUFFER_AI_PU_BIZ_BIU1__052' line: 16, col: 12
At procedure 'FK_BOV_WRITE14' line: 81, col: 5
At procedure 'FK_BOV14' line: 256, col: 5
At procedure 'GL_FK_TETEL14_CPY' line: 151, col: 3; At function 'LIT.GL_FK_TETEL14_CPY_RUN_WITH_EX' line: 336, col: 9 [SQLState:HY000, ISC error code:335544517]
jdbc:firebirdsql:172.16.173.98/3050:c:\Libra3sTesztRendszer\data\libra3sdbteszt_fulldb.gdb3s
select lit.gl_fk_tetel14_cpy_run_with_ex(15021, 15021, 'KA', null, null, 'N')
from rdb$database

I can send the FTP details for database on request.

@sim1984
Copy link

sim1984 commented Jul 20, 2023

why did you decide that this plan was wrong? In 5.0 there were changes in the optimizer . In most cases, the plan is more optimal. Just compare the execution speed of the same query. as for the extra insert, I have a suspicion that this is due to the fact that it is in the procedure with which join takes place. This cannot be done because the order of execution of sub-operations in the request is not defined.

@dyemanov dyemanov self-assigned this Jul 21, 2023
@dyemanov
Copy link
Member

Is it reproducible on the database you provided me the last time? I see that at least the plan is the same as you reported here.

@EPluribusUnum
Copy link
Author

@sim1984 FK_TETEL table can be very big. This NATURAL read cause millions of unnecessary reads on big customer databases : most or all of them are filtered out with the ON t.alrsor = bt.id condition.
One example. PU_BIZ count : 3941088, PU_BTET count : 4501807, FK_TETEL count : 7615604, FK_BUFFER count : 99
FB30, FB40 : 1 PU_BIZ index read, 1 PU_BTET index read, 1 FK_BUFFER index read, exec time 0.0 ms
FB50 : 1 PU_BIZ index read, 6885311 PU_BTET index read, 99 FK_BUFFER non index read, 7615604 FK_TETEL non-index read, exec time 2m 23s 891ms

@dyemanov , found the wrong result problem! It is an INSERT-SELECT issue, the newly inserted records were not filtered out in WHERE, and sometimes the FOR SELECT read up the record inserted in the body of the loop. Adding an extra condition fixed it, it's not an FB engine bug.

@EPluribusUnum EPluribusUnum changed the title Firebird 5 - wrong plan and sometimes wrong result Firebird 5 - wrong plan Jul 21, 2023
@omachtandras
Copy link

Is it reproducible on the database you provided me the last time? I see that at least the plan is the same as you reported here.

Yes.

@dyemanov
Copy link
Member

In fact, this is a duplicate #1476. The plan changes due to #6992 which converts LEFT JOIN into INNER JOIN. Condition t.alrsor IS NOT NULL does not prevent this transformation because there's also condition t.tabla = IIF(b.igaz = 'F', 'FK_TETEL', 'FK_BUFFER'). And finally UNION is placed on the first position (our old limitation), thus making the plan bad.

I will investigate ways to improve the things.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants