Subject Perfomance problems
Author Carsten Schäfer
Hi,
i really have some perfomance problems with selects which includes or-clause. (using Firebird 1.5.2 RC3)
This one is fast (<10ms):
SELECT t_apos.ID_APOS
FROM t_apos
JOIN t_auftrag ON f_id_auftrag = id_auftrag
WHERE F_ID_WERKSTOFF = 11;
PLAN JOIN (T_APOS INDEX (RDB$FOREIGN161),T_AUFTRAG INDEX (RDB$PRIMARY39))
RDB$FOREIGN161 = F_ID_WERKSTOFF
RDB$PRIMARY39 = ID_AUFTRAG

This one is slow (>15sec)
SELECT t_apos.ID_APOS
FROM t_apos
JOIN t_auftrag ON f_id_auftrag = id_auftrag
WHERE F_ID_WERKSTOFF = 11 OR F_ID_WERKSTOFF = 245
PLAN JOIN (T_AUFTRAG NATURAL,T_APOS INDEX (RDB$FOREIGN1,RDB$FOREIGN161,RDB$FOREIGN161))
RDB$FOREIGN161 = F_ID_WERKSTOFF
RDB$FOREIGN1 = F_ID_AUFTRAG

Does anyone has an explanation. This can't be normal.
Same effect happens for every select with or clause. (see previous post: Perfomance differences)

Table definitions:

CREATE TABLE T_APOS (
ID_APOS INTEGER NOT NULL,
F_ID_RUECK INTEGER NOT NULL,
F_ID_ANLIEFER INTEGER NOT NULL,
F_ID_RUVER INTEGER NOT NULL,
F_ID_ANVER INTEGER NOT NULL,
F_ID_VORSCHRIFT INTEGER NOT NULL,
F_ID_AUFTRAG INTEGER NOT NULL,
F_ID_ANGEBOT INTEGER NOT NULL,
F_ID_LAGERPOSZUORD INTEGER NOT NULL,
F_TEILNR VARCHAR(150),
F_BEZEICHNUNG VARCHAR(200),
F_ID_WERKSTOFF INTEGER NOT NULL,
F_GEOFAKTOR INTEGER,
F_ID_ARBEITSPLAN INTEGER NOT NULL,
F_KH_VON_SOLL DOUBLE PRECISION,
F_KH_BIS_SOLL DOUBLE PRECISION,
F_KH_EINHEIT_SOLL VARCHAR(15),
F_KH_VON_IST DOUBLE PRECISION,
F_KH_BIS_IST DOUBLE PRECISION,
F_MENGE INTEGER,
F_EM DOUBLE PRECISION,
F_GEWICHT DOUBLE PRECISION,
F_ZEICHNR VARCHAR(100),
F_ZEICHDATUM DATE,
F_KOMMENTAR VARCHAR(1000),
F_LIEFERTERMIN DATE,
F_SPLITSTATUS VARCHAR(100),
F_AUSLIEFER_MENGE INTEGER,
F_RECHNUNGSTELLUNG DATE,
F_ANZAHL_TBK INTEGER,
F_FULL_CHECK INTEGER,
F_T_LIEFER INTEGER,
F_ID_MA_ACT INTEGER NOT NULL,
F_TIEFE_VON_SOLL DOUBLE PRECISION,
F_TIEFE_BIS_SOLL DOUBLE PRECISION,
F_TIEFE_VON_IST DOUBLE PRECISION,
F_TIEFE_BIS_IST DOUBLE PRECISION,
F_BEST_NR VARCHAR(30),
F_BEST_DATUM DATE,
F_KOM_LIEFER VARCHAR(1000),
F_STATUS INTEGER,
F_GH_VON_SOLL DOUBLE PRECISION,
F_GH_BIS_SOLL DOUBLE PRECISION,
F_GH_VON_IST DOUBLE PRECISION,
F_GH_BIS_IST DOUBLE PRECISION,
F_RH_VON_SOLL DOUBLE PRECISION,
F_RH_BIS_SOLL DOUBLE PRECISION,
F_RH_VON_IST DOUBLE PRECISION,
F_RH_BIS_IST DOUBLE PRECISION,
F_RC_VON_SOLL DOUBLE PRECISION,
F_RC_VON_IST DOUBLE PRECISION,
F_GH_EINHEIT_SOLL VARCHAR(15),
F_RH_EINHEIT_SOLL VARCHAR(15),
F_POSITION INTEGER,
F_LIEFER_NR VARCHAR(32),
F_RECH_NR VARCHAR(32),
F_ANR_KUNDE VARCHAR(32),
F_PRUEFZEUGNISART INTEGER,
F_FOLGEBEHANDLUNG INTEGER,
F_RH_EINHEIT_IST VARCHAR(15),
F_KH_EINHEIT_IST VARCHAR(15),
F_GH_EINHEIT_IST VARCHAR(15),
F_ID_FREMDAUFTRAG INTEGER default 0 NOT NULL,
F_RC_BIS_SOLL DOUBLE PRECISION DEFAULT -1,
F_RC_BIS_IST DOUBLE PRECISION DEFAULT -1,
F_RC_TIEFE_VON_SOLL DOUBLE PRECISION DEFAULT -1,
F_RC_TIEFE_BIS_SOLL DOUBLE PRECISION DEFAULT -1,
F_RC_TIEFE_VON_IST DOUBLE PRECISION DEFAULT -1,
F_RC_TIEFE_BIS_IST DOUBLE PRECISION DEFAULT -1,
F_DEACTIVATION TIMESTAMP,
F_AUSLIEFERUNG TIMESTAMP,
F_LIEFERSCHEIN_DATUM TIMESTAMP,
F_ANZANLIEFERVERPACKUNGEN INTEGER default 1,
F_FREIGABENOETIG INTEGER default 0,
F_FREIGABEDATUM TIMESTAMP,
F_ID_FREIGABEMITARBEITER INTEGER default 0,
F_ID_POSITIONSSERIE INTEGER default 0 NOT NULL,
F_RECH_KOMMENTAR VARCHAR(1000),
F_ANGEBOTNR VARCHAR(25),
F_AUSLIEFERUNG_DATUM TIMESTAMP,
F_AUSLIEFERUNG_NR VARCHAR(25),
F_PROFORMALIEFERSCHEIN INTEGER,
F_PRUEFZEUGNIS_DATUM TIMESTAMP,
F_PRUEFZEUGNIS_KOMMENTAR VARCHAR(1000),
F_MITSONDERFREIGABE INTEGER default 0 NOT NULL,
F_KOSTENLOS INTEGER DEFAULT 0 NOT NULL,
F_KOSTENLOS_MITPOS INTEGER DEFAULT 0 NOT NULL,
F_ID_MA_KOSTENLOS INTEGER DEFAULT 0 NOT NULL,
F_DAT_KOSTENLOS TIMESTAMP,
F_MITAUFTRAGSKLARSTELLUNG INTEGER default 0 NOT NULL,
F_OHNEEMAILVERSAND INTEGER default 0 NOT NULL,
F_ID_APOSDERNACHARBEIT INTEGER default 0 NOT NULL,
F_ID_APOSNACHARBEITFUER INTEGER default 0 NOT NULL,
F_APOSNRDERNACHARBEIT VARCHAR(25),
F_PRUEFZEUGNIS_MA INTEGER default 0 NOT NULL,
F_DAT_ERSTELLUNG TIMESTAMP,
F_ID_MA_ERSTELLER INTEGER NOT NULL
);

ALTER TABLE T_APOS ADD PRIMARY KEY (ID_APOS);

ALTER TABLE T_APOS ADD CONSTRAINT APOSANLIEFERTRANS FOREIGN KEY (F_ID_ANLIEFER) REFERENCES T_TRANSPORT (ID_TRANSPORT) ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE T_APOS ADD CONSTRAINT APOSANLIEFERVERP FOREIGN KEY (F_ID_ANVER) REFERENCES T_VERPACKUNG (ID_VERPACKUNG) ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE T_APOS ADD CONSTRAINT APOSAPLAN FOREIGN KEY (F_ID_ARBEITSPLAN) REFERENCES T_ARBEITSPLAN (ID_ARBEITSPLAN) ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE T_APOS ADD CONSTRAINT APOSLAGERPOS FOREIGN KEY (F_ID_LAGERPOSZUORD) REFERENCES T_LAGERPOSZUORD (ID_LAGERPOSZUORD) ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE T_APOS ADD CONSTRAINT APOSMIT FOREIGN KEY (F_ID_MA_ACT) REFERENCES T_MITARBEITER (ID_MITARBEITER) ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE T_APOS ADD CONSTRAINT APOSSER FOREIGN KEY (F_ID_POSITIONSSERIE) REFERENCES T_POSITIONSSERIE (ID_POSITIONSSERIE) ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE T_APOS ADD CONSTRAINT APOSTRANS FOREIGN KEY (F_ID_RUECK) REFERENCES T_TRANSPORT (ID_TRANSPORT) ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE T_APOS ADD CONSTRAINT APOSVERP FOREIGN KEY (F_ID_RUVER) REFERENCES T_VERPACKUNG (ID_VERPACKUNG) ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE T_APOS ADD CONSTRAINT APOSVOR FOREIGN KEY (F_ID_VORSCHRIFT) REFERENCES T_BEHVORSCHRIFT (ID_BEHVORSCHRIFT) ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE T_APOS ADD CONSTRAINT APOSWERK FOREIGN KEY (F_ID_WERKSTOFF) REFERENCES T_WERKSTOFF (ID_WERKSTOFF) ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE T_APOS ADD CONSTRAINT FK_APOS_ID_AUFTRAG FOREIGN KEY (F_ID_AUFTRAG) REFERENCES T_AUFTRAG (ID_AUFTRAG) ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE T_APOS ADD CONSTRAINT FK_APOS_MA_ERSTELLER FOREIGN KEY (F_ID_MA_ERSTELLER) REFERENCES T_MITARBEITER (ID_MITARBEITER) ON DELETE CASCADE ON UPDATE NO ACTION;
ALTER TABLE T_APOS ADD CONSTRAINT FK_APOS_MA_KL FOREIGN KEY (F_ID_MA_KOSTENLOS) REFERENCES T_MITARBEITER (ID_MITARBEITER) ON DELETE CASCADE ON UPDATE NO ACTION;
ALTER TABLE T_APOS ADD CONSTRAINT FK_APOS_MA_PZ FOREIGN KEY (F_PRUEFZEUGNIS_MA) REFERENCES T_MITARBEITER (ID_MITARBEITER) ON DELETE CASCADE ON UPDATE NO ACTION;
ALTER TABLE T_APOS ADD CONSTRAINT FREMDAUFTRAGAPOS FOREIGN KEY (F_ID_FREMDAUFTRAG) REFERENCES T_FREMDAUFTRAG (ID_FREMDAUFTRAG) ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE T_APOS ADD FOREIGN KEY (F_ID_FREIGABEMITARBEITER) REFERENCES T_MITARBEITER (ID_MITARBEITER);

CREATE INDEX APOS_LIEFERNR ON T_APOS (F_LIEFER_NR);
CREATE INDEX IND_APOS_AUSLIEFERUNG ON T_APOS (F_AUSLIEFERUNG);
CREATE DESCENDING INDEX IND_APOS_ID ON T_APOS (ID_APOS);
CREATE INDEX IND_APOS_LIEFERTERMIN ON T_APOS (F_LIEFERTERMIN);



CREATE TABLE T_AUFTRAG (
ID_AUFTRAG INTEGER NOT NULL,
F_AUFTRAGNR VARCHAR(20) NOT NULL,
F_ID_KUNDE INTEGER NOT NULL,
F_LS_NR VARCHAR(30),
F_LS_DATUM DATE,
F_ID_MA INTEGER NOT NULL,
F_KOMMENTAR VARCHAR(1000),
F_KOM_LIEFER VARCHAR(1000),
F_ID_MA_ACT INTEGER NOT NULL,
F_ACTIVE INTEGER,
F_T_LIEFER INTEGER,
F_T_RECHNUNG INTEGER,
F_STATUS INTEGER,
F_ID_SERIE INTEGER NOT NULL,
F_DEACTIVATION TIMESTAMP,
F_ADATUM TIMESTAMP
);

ALTER TABLE T_AUFTRAG ADD UNIQUE (F_AUFTRAGNR);

ALTER TABLE T_AUFTRAG ADD PRIMARY KEY (ID_AUFTRAG);

ALTER TABLE T_AUFTRAG ADD CONSTRAINT AUFSER FOREIGN KEY (F_ID_SERIE) REFERENCES T_SERIE (ID_SERIE) ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE T_AUFTRAG ADD CONSTRAINT AUFTRAGMIT FOREIGN KEY (F_ID_MA) REFERENCES T_MITARBEITER (ID_MITARBEITER) ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE T_AUFTRAG ADD CONSTRAINT AUFTRAGMITACT FOREIGN KEY (F_ID_MA_ACT) REFERENCES T_MITARBEITER (ID_MITARBEITER) ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE T_AUFTRAG ADD CONSTRAINT FS_KUNDE_AUFTRAG FOREIGN KEY (F_ID_KUNDE) REFERENCES T_KUNDE (ID_KUNDE) ON DELETE NO ACTION ON UPDATE NO ACTION;

CREATE INDEX IND_AUFTRAG_ADATUM ON T_AUFTRAG (F_ADATUM);
CREATE DESCENDING INDEX IND_AUFTRAG_ID ON T_AUFTRAG (ID_AUFTRAG);


mfg
Carsten




[Non-text portions of this message have been removed]