Subject Perfomance differences
Author Carsten Schäfer
Hi,
I'm using Firebird 1.5.2 RC3.
I have 2 tables (definitions at the end of this message):
the following select is fast: (1 sec)
SELECT t_apos.ID_APOS, t_apos.f_liefer_nr,t_apos.f_status,t_apos.f_id_auftrag,t_auftrag.f_id_kunde FROM t_apos JOIN t_auftrag ON f_id_auftrag = id_auftrag WHERE (t_apos.f_status = 13 AND t_auftrag.f_adatum between '27.08.2004 00:00' AND '27.11.2004 11:23' ) AND id_apos != 0
Plan: PLAN JOIN (T_AUFTRAG INDEX (IND_AUFTRAG_ADATUM),T_APOS INDEX (RDB$FOREIGN1))

and this is slow: (>191 sec)
SELECT t_apos.ID_APOS, t_apos.f_liefer_nr,t_apos.f_status,t_apos.f_id_auftrag,t_auftrag.f_id_kunde FROM t_apos JOIN t_auftrag ON f_id_auftrag = id_auftrag WHERE (t_apos.f_status = 13 AND t_auftrag.f_adatum between '27.08.2004 00:00' AND '27.11.2004 11:23' ) AND id_apos > 0
Plan:PLAN JOIN (T_AUFTRAG INDEX (IND_AUFTRAG_ADATUM),T_APOS INDEX (RDB$FOREIGN1,RDB$PRIMARY44))

Only difference is id_apos != 0 and id_apos >0
Interbase Plananalyzer tells me that it needs > 190 seconds to fetch the values (about 15.000)

Can someone explain why this big difference happens ?

Another difference i don't understand:
This one
SELECT t_apos.ID_APOS, t_apos.f_liefer_nr,t_apos.f_status,t_apos.f_id_auftrag,t_auftrag.f_id_kunde FROM t_apos JOIN t_auftrag ON f_id_auftrag = id_auftrag WHERE t_auftrag.f_id_kunde = 10 AND id_apos != 0
PLAN:PLAN JOIN (T_AUFTRAG INDEX (RDB$FOREIGN146),T_APOS INDEX (RDB$FOREIGN1))

is always faster than
SELECT t_apos.ID_APOS, t_apos.f_liefer_nr,t_apos.f_status,t_apos.f_id_auftrag,t_auftrag.f_id_kunde FROM t_apos JOIN t_auftrag ON f_id_auftrag = id_auftrag WHERE (t_auftrag.f_id_kunde = 10 AND t_auftrag.f_adatum between '27.08.2004 00:00' AND '27.11.2004 11:23' ) AND id_apos != 0
PLAN: PLAN JOIN (T_AUFTRAG INDEX (RDB$FOREIGN146,IND_AUFTRAG_ADATUM),T_APOS INDEX (RDB$FOREIGN1))
which takes more time when the difference in the dates is growing.

The first one is faster although there are more values to fetch.
Can someone please explain this ?

mfg
Carsten



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


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