Hi
i run multiple comparision tests against FB3 vs FB5.
Most queries are faster in FB5 :)
But multiple are affected by natural plan. Below simplest query affected:
SELECT
RL.DYR_ID
, RL.ROZLICZ_RODZ_DZIAL_ID
, SUM(RL.ROZLICZ_KWOTA_ROZLICZONA)
FROM
ROZLICZENIE RL
INNER JOIN DOK_ROZLICZENIOWY DK ON DK.DOK_ROZLICZENIOWY_ID = RL.DOK_ROZLICZENIOWY_ID
INNER JOIN UMOWA U ON RL.UMOWA_ID=U.UMOWA_ID AND RL.DYR_ID=U.DYR_ID AND RL.UMOWA_ID_SEQ=U.UMOWA_ID_SEQ
WHERE
RL.OKRES_NUMER BETWEEN '2016.01'
AND '2016.12'
AND DK.DOK_ROZLICZENIOWY_INKASO = 'T'
AND U.RODZ_UMOWY_ID='LI'
GROUP BY
RL.DYR_ID
, RL.ROZLICZ_RODZ_DZIAL_ID
FB3 PLAN:
PLAN SORT (JOIN (U INDEX (FK_UMOWA__RODZAJ_UMOWY), RL INDEX (FK_ROZLICZENIE__UMOWA), DK INDEX (PK_DOK_ROZLICZENIOWY)))
FB5 RC 2
PLAN SORT (JOIN (DK NATURAL, RL INDEX (ROZLICZENIE_FK4), U INDEX (PK_UMOWA)))
avarege execution time form 5 runs excluding cold one:
on FB3: 571 ms
on FB5: 4675 ms
below index statistics:
| RDB$INDEX_NAME |
RDB$RELATION_NAME |
RDB$UNIQUE_FLAG |
RDB$SEGMENT_COUNT |
RDB$FOREIGN_KEY |
RDB$STATISTICS |
RDB$FIELD_NAME |
RDB$FIELD_POSITION |
RDB$STATISTICS_1 |
| FK_ROZLICZENIE__UMOWA |
ROZLICZENIE |
0 |
3 |
PK_UMOWA |
0,000001695927 |
UMOWA_ID |
0 |
0,000001699204 |
| FK_ROZLICZENIE__UMOWA |
ROZLICZENIE |
0 |
3 |
PK_UMOWA |
0,000001695927 |
DYR_ID |
1 |
0,000001696033 |
| FK_ROZLICZENIE__UMOWA |
ROZLICZENIE |
0 |
3 |
PK_UMOWA |
0,000001695927 |
UMOWA_ID_SEQ |
2 |
0,000001695927 |
| FK_UMOWA__RODZAJ_UMOWY |
UMOWA |
0 |
2 |
PK_RODZAJ_UMOWY |
0,014705882408 |
RODZ_UMOWY_ID |
0 |
0,018518518656 |
| FK_UMOWA__RODZAJ_UMOWY |
UMOWA |
0 |
2 |
PK_RODZAJ_UMOWY |
0,014705882408 |
TYP_UMOWY_ID |
1 |
0,014705882408 |
| PK_DOK_ROZLICZENIOWY |
DOK_ROZLICZENIOWY |
1 |
1 |
|
0,047619048506 |
DOK_ROZLICZENIOWY_ID |
0 |
0,047619048506 |
| PK_UMOWA |
UMOWA |
1 |
3 |
|
0,000001603554 |
UMOWA_ID |
0 |
0,000001607097 |
| PK_UMOWA |
UMOWA |
1 |
3 |
|
0,000001603554 |
DYR_ID |
1 |
0,000001603649 |
| PK_UMOWA |
UMOWA |
1 |
3 |
|
0,000001603554 |
UMOWA_ID_SEQ |
2 |
0,000001603554 |
| ROZLICZENIE_FK4 |
ROZLICZENIE |
0 |
1 |
PK_DOK_ROZLICZENIOWY |
0,047619048506 |
DOK_ROZLICZENIOWY_ID |
0 |
0,047619048506 |
table structure for index, join ,where:
/* 700k records */
CREATE TABLE UMOWA
(
UMOWA_ID CHAR(8) NOT NULL,
DYR_ID SMALLINT NOT NULL,
UMOWA_ID_SEQ SMALLINT NOT NULL,
TYP_UMOWY_ID CHAR(1) NOT NULL,
RODZ_UMOWY_ID CHAR(2) NOT NULL,
CONSTRAINT PK_UMOWA PRIMARY KEY (UMOWA_ID,DYR_ID,UMOWA_ID_SEQ)
);
/* 21 records */
CREATE TABLE DOK_ROZLICZENIOWY
(
DOK_ROZLICZENIOWY_ID CHAR(2) NOT NULL,
DOK_ROZLICZENIOWY_INKASO CHAR(1) NOT NULL,
CONSTRAINT PK_DOK_ROZLICZENIOWY PRIMARY KEY (DOK_ROZLICZENIOWY_ID)
);
/* 7kk records */
CREATE TABLE ROZLICZENIE
(
DYR_ID SMALLINT NOT NULL,
INSP_ID SMALLINT NOT NULL,
OKRES_NUMER CHAR(7) NOT NULL,
ROZLICZ_NR SMALLINT NOT NULL,
ROZLICZ_NR_POZ SMALLINT NOT NULL,
UMOWA_ID CHAR(8) NOT NULL,
UMOWA_ID_SEQ SMALLINT NOT NULL,
UMOWA_ID_POZ SMALLINT NOT NULL,
DOK_ROZLICZENIOWY_ID CHAR(2) NOT NULL,
ROZLICZ_RODZ_DZIAL_ID CHAR(3),
ROZLICZ_KWOTA_ROZLICZONA DECIMAL(10,2) NOT NULL,
CONSTRAINT PK_ROZLICZENIE PRIMARY KEY (DYR_ID,INSP_ID,OKRES_NUMER,ROZLICZ_NR,ROZLICZ_NR_POZ)
);
CREATE TABLE RODZAJ_UMOWY
(
RODZ_UMOWY_ID CHAR(2) NOT NULL,
TYP_UMOWY_ID CHAR(1) NOT NULL,
CONSTRAINT PK_RODZAJ_UMOWY PRIMARY KEY (RODZ_UMOWY_ID,TYP_UMOWY_ID)
);
ALTER TABLE ROZLICZENIE ADD CONSTRAINT FK_ROZLICZENIE__UMOWA FOREIGN KEY(UMOWA_ID, DYR_ID, UMOWA_ID_SEQ) REFERENCES UMOWA(UMOWA_ID, DYR_ID, UMOWA_ID_SEQ) ON UPDATE CASCADE;
ALTER TABLE UMOWA ADD CONSTRAINT FK_UMOWA__RODZAJ_UMOWY FOREIGN KEY(RODZ_UMOWY_ID, TYP_UMOWY_ID) REFERENCES RODZAJ_UMOWY(RODZ_UMOWY_ID, TYP_UMOWY_ID) ON UPDATE CASCADE;
ALTER TABLE ROZLICZENIE ADD CONSTRAINT ROZLICZENIE_FK4 FOREIGN KEY(DOK_ROZLICZENIOWY_ID) REFERENCES DOK_ROZLICZENIOWY(DOK_ROZLICZENIOWY_ID) ;
Hi
i run multiple comparision tests against FB3 vs FB5.
Most queries are faster in FB5 :)
But multiple are affected by natural plan. Below simplest query affected:
avarege execution time form 5 runs excluding cold one:
on FB3: 571 ms
on FB5: 4675 ms
below index statistics:
table structure for index, join ,where: