Regression: The order for joining the tables is less than optimal in Firebird
2.x.
----------------------------------------------------------------------------------
Key: CORE-4702
URL: http://tracker.firebirdsql.org/browse/CORE-4702
Project: Firebird Core
Issue Type: Bug
Components: Engine
Affects Versions: 3.0 Beta 1
Reporter: Simonov Denis
Priority: Minor
CREATE TABLE TRIAL (
CODE_TRIAL INTEGER NOT NULL,
CODE_PRIZE INTEGER NOT NULL,
BYDATE DATE
);
CREATE TABLE PRIZE (
CODE_PRIZE INTEGER NOT NULL,
NAME VARCHAR(70) NOT NULL
);
CREATE TABLE TRIAL_LINE (
CODE_TRIAL_LINE INTEGER NOT NULL,
CODE_TRIAL INTEGER NOT NULL
);
INSERT INTO PRIZE(CODE_PRIZE, NAME)
WITH RECURSIVE T (N) AS (
SELECT 1 FROM RDB$DATABASE
UNION ALL
SELECT N+1 FROM T WHERE N < 1000
)
SELECT N+8000, '' FROM T;
COMMIT;
INSERT INTO TRIAL(CODE_TRIAL, CODE_PRIZE, BYDATE)
WITH RECURSIVE T (N) AS (
SELECT 1 FROM RDB$DATABASE
UNION ALL
SELECT N+1 FROM T WHERE N < 1000
)
SELECT T1.N + (T2.N-1)*1000, MOD(T1.N, 20)+8001, DATEADD(T1.N DAY TO date
'01.01.2000') FROM T T1, T T2 WHERE T1.N + (T2.N-1)*1000 < 100000;
COMMIT;
INSERT INTO TRIAL_LINE(CODE_TRIAL_LINE, CODE_TRIAL)
WITH RECURSIVE T (N) AS (
SELECT 1 FROM RDB$DATABASE
UNION ALL
SELECT N+1 FROM T WHERE N < 1000
)
SELECT T1.N + (T2.N-1)*1000, MOD(T1.N + (T2.N-1)*1000, 99998)+1 FROM T T1, T T2
WHERE T1.N + (T2.N-1)*1000 < 150000;
COMMIT;
ALTER TABLE TRIAL ADD CONSTRAINT PK_TRIAL PRIMARY KEY (CODE_TRIAL);
ALTER TABLE PRIZE ADD CONSTRAINT PK_PRIZE PRIMARY KEY (CODE_PRIZE);
ALTER TABLE TRIAL_LINE ADD CONSTRAINT PK_TRIAL_LINE PRIMARY KEY
(CODE_TRIAL_LINE);
ALTER TABLE TRIAL_LINE ADD CONSTRAINT FK_TRIAL_LINE_TRIAL FOREIGN KEY
(CODE_TRIAL) REFERENCES TRIAL (CODE_TRIAL);
ALTER TABLE TRIAL ADD CONSTRAINT FK_TRIAL_PRIZE FOREIGN KEY (CODE_PRIZE)
REFERENCES PRIZE (CODE_PRIZE);
CREATE INDEX IDX_BYDATE ON TRIAL(BYDATE);
SELECT count(*)
FROM
TRIAL
JOIN PRIZE ON PRIZE.CODE_PRIZE = TRIAL.CODE_PRIZE
JOIN TRIAL_LINE ON TRIAL_LINE.CODE_TRIAL = TRIAL.CODE_TRIAL
WHERE TRIAL.BYDATE between date '01.01.2000' AND date '31.12.2000';
In Firebird 2.5
PLAN JOIN (TRIAL INDEX (IDX_BYDATE), PRIZE INDEX (PK_PRIZE), TRIAL_LINE INDEX
(FK_TRIAL_LINE_TRIAL))
COUNT
============
54751
Current memory = 138716136
Delta memory = 24
Max memory = 138766504
Elapsed time= 0.33 sec
Buffers = 16384
Reads = 0
Writes 0
Fetches = 438079
In Firebird 3.0
PLAN JOIN (TRIAL INDEX (IDX_BYDATE), TRIAL_LINE INDEX (FK_TRIAL_LINE_TRIAL),
PRIZE INDEX (PK_PRIZE))
COUNT
=====================
54751
Current memory = 145145264
Delta memory = 0
Max memory = 145198152
Elapsed time= 0.432 sec
Buffers = 16384
Reads = 0
Writes = 0
Fetches = 511076
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://tracker.firebirdsql.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
------------------------------------------------------------------------------
Dive into the World of Parallel Programming The Go Parallel Website, sponsored
by Intel and developed in partnership with Slashdot Media, is your hub for all
things parallel software development, from weekly thought leadership blogs to
news, videos, case studies, tutorials and more. Take a look and join the
conversation now. http://goparallel.sourceforge.net/
Firebird-Devel mailing list, web interface at
https://lists.sourceforge.net/lists/listinfo/firebird-devel