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

Reply via email to