Subject Delete is very slow
Author Carsten Schäfer
I have the following situation.
Two tables:

CREATE TABLE T_VERPACKUNGZUORDNUNG (
ID_VERPACKUNGZUORDNUNG INTEGER NOT NULL,
F_ID_VERPACKUNG INTEGER DEFAULT 0 NOT NULL,
F_ID_LAGERORT INTEGER DEFAULT 0 NOT NULL,
F_ZUSATZ VARCHAR(250),
F_KENNZEICHNUNG VARCHAR(100),
F_ANZAHL INTEGER DEFAULT 1
);

ALTER TABLE T_VERPACKUNGZUORDNUNG ADD CONSTRAINT PK_VZ PRIMARY KEY
(ID_VERPACKUNGZUORDNUNG);


CREATE TABLE T_VERPACKUNG_FAI_ZUORD (
F_ID_VERPACKUNGZUORDNUNG INTEGER NOT NULL,
F_ID_APOS INTEGER NOT NULL,
F_ID_FERTIGUNGSAUFTRAG INTEGER NOT NULL,
F_ANLIEFERVERPACKUNG INTEGER DEFAULT 0
);

ALTER TABLE T_VERPACKUNG_FAI_ZUORD ADD CONSTRAINT
PK_VERPACKUNG_FAI_ZUORD PRIMARY KEY (F_ID_VERPACKUNGZUORDNUNG);

ALTER TABLE T_VERPACKUNG_FAI_ZUORD ADD CONSTRAINT
FK_VERPACKUNG_FAI_ZUORD_APOS FOREIGN KEY (F_ID_APOS) REFERENCES T_APOS
(ID_APOS) ON DELETE CASCADE ON UPDATE NO ACTION;
ALTER TABLE T_VERPACKUNG_FAI_ZUORD ADD CONSTRAINT
FK_VERPACKUNG_FAI_ZUORD_FA FOREIGN KEY (F_ID_FERTIGUNGSAUFTRAG)
REFERENCES T_FERTIGUNGSAUFTRAG (ID_FERTIGUNGSAUFTRAG) ON DELETE CASCADE
ON UPDATE NO ACTION;
ALTER TABLE T_VERPACKUNG_FAI_ZUORD ADD CONSTRAINT
FK_VERPACKUNG_FAI_ZUORD_VERP FOREIGN KEY (F_ID_VERPACKUNGZUORDNUNG)
REFERENCES T_VERPACKUNGZUORDNUNG (ID_VERPACKUNGZUORDNUNG) ON DELETE
CASCADE ON UPDATE NO ACTION;

Now i want to do a delete:
delete from T_VERPACKUNGZUORDNUNG v where exists (select 1 from
T_VERPACKUNG_FAI_ZUORD v2 where v.ID_VERPACKUNGZUORDNUNG =
v2.F_ID_VERPACKUNGZUORDNUNG and v2.F_ID_APOS = 1000 and
v2.F_ID_FERTIGUNGSAUFTRAG =1000)

This is very slow, because Firebird is doing a full table scan on both
tables !
Plan:
PLAN (V2 INDEX (PK_VERPACKUNG_FAI_ZUORD))
PLAN (V NATURAL)
Adapted plan:
PLAN (V2 INDEX (PK_VERPACKUNG_FAI_ZUORD)) PLAN (V NATURAL)

When is use a standard IN Statement like:
DELETE FROM T_VERPACKUNGZUORDNUNG v where v.id_verpackungzuordnung in
(select v2.f_id_verpackungzuordnung from t_verpackung_fai_zuord v2
where v2.f_id_apos = 1000 and v2.F_ID_FERTIGUNGSAUFTRAG =1000)
the plan and the speed is the same.
I have tried it with Firebird 2.0.3 and version 2.1.0 RC1.

How can i optimize the delete ?

Carsten