Gegeben ist folgende Abfrage:
Code:
select
lsptext.art,
lsptext."POSITION" Pos,
lsptext.textline
from sendpos
left outer join lscoll on lscoll.lskopf_id = sendpos.lskopf_id
inner join lspack on
lspack.lskopf_id = lscoll.lskopf_id
and lspack.colli_nr = lscoll.colli_nr
inner join lsptext on
lsptext.lspos_id = lspack.lspos_id
and lsptext.art in ('G1', 'G2', 'G3', 'G4', 'G5', 'G6', 'D1', 'D2', 'D3', 'D4', 'D5') -- JOIN
where sendpos.sendk_id = 101821515
Die Ausführungszeit beträgt ~ 0.7s, Datenmenge ist 1.
Will ich nun zusätzlich das "POSITION" Feld abfragen, so erhöht sich die Abfragezeit auf ~5 s. Dabei spielt das Abfragekonstrukt keine Rolle:
Abfrage mit JOIN erweitert
Code:
and lsptext."POSITION" = 25
Abfrage als Subquery
Code:
select x.* from
(
-- <obige
Query>
) x
where x.Pos = 25
Abfrage mit WHERE erweitert
Code:
and lsptext."POSITION" = 25
Alle relevanten Felder sind indiziert
Code:
CREATE TABLE LSPTEXT
(
ID DOUBLE PRECISION NOT NULL,
LSKOPF_ID DOUBLE PRECISION,
LSPOS_ID DOUBLE PRECISION,
"POSITION" SMALLINT,
KSL SMALLINT,
ART CHAR(4),
TEXTLINE CHAR(132),
CONSTRAINT PK_LSPTEXT PRIMARY KEY (ID)
);
/* Index definitions for LSPTEXT */
CREATE INDEX LSPTEXT_ART ON LSPTEXT(ART);
CREATE INDEX LSPTEXT_ID ON LSPTEXT(ID);
CREATE INDEX LSPTEXT_LSKOPF_ID ON LSPTEXT(LSKOPF_ID);
CREATE INDEX LSPTEXT_LSPOS_ID ON LSPTEXT(LSPOS_ID);
CREATE INDEX LSPTEXT_POSITION ON LSPTEXT("POSITION");
Laut PLAN werden die auch benutzt:
Code:
Select - PLAN JOIN (JOIN (JOIN (SENDPOS INDEX (SENDPOS_LSNR), LSCOLL INDEX (LSCOLL_LSKOPF_ID)), LSPACK INDEX (LSPACK_LSKOPF_ID, LSPACK_COLLI_NR)), LSPTEXT INDEX (LSPTEXT_LSPOS_ID, LSPTEXT_POSITION))