Skip to content

FB5 bad plan for query #7904

@livius2

Description

@livius2

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) ;

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions