Hallo Herr Kosch,
ich habe ein Problem bei der Verwendung von Views in Interbase. Die Frage habe ich schon in mehreren Foren sowie direkt an Borland gestellt. Leider hat mir bisher niemand etwas dazu sagen können.
Umgebung: Interbase Server 5.6 / Interbase 6.5
Und zwar gibt es ein Performance-Problem, welches bei der Ausführung von SQL-Anweisungen mit Left Join auftritt, wenn ich eine Tabelle durch ein View ersetzen.
Dabei besteht das View nur aus einem SELECT * FROM TABELLE, so das die Ausführungszeit/Anzahl der Leseoperationen eigentlich gleich bleiben müsste. Dies ist jedoch nur bei einem normalen Join so.
Select-Anweisung mit der Tabelle:
SELECT *
FROM TABLE1 T1 LEFT JOIN TABLE2 T2 ON T1.FI_TABLE2 = T2.ID
Ergebnis-Zeilen: 10
Leseoperationen für Tabelle2: 10 Indexes Reads
Select-Anweisung mit dem View:
SELECT *
FROM TABLE1 T1 LEFT JOIN VW_TABLE2 T2 ON T1.FI_TABLE2 = T2.ID
Ergebnis-Zeilen: 10
Leseoperationen für Tabelle2: 100 Non-Indexes Reads
Es sieht so aus, dass im zweiten Fall für jede Ergebnis-Zeile jeweils das komplette View gelesen wird. Dies ist meiner Meinung nach nicht notwendig, der Plan für die beiden Abfragen sollte gleich sein. Lässt sich dies verhindern ? Oder gibt es hier einen Denkfehler ?
Gruß A.Meier
Metadaten:
CREATE DOMAIN DO_ID AS INTEGER NOT NULL;
CREATE TABLE TABLE1( ID DO_ID, FI_TABLE2 DO_ID); ALTER TABLE TABLE1 ADD CONSTRAINT PK_TABLE1 PRIMARY KEY (ID); CREATE INDEX TABLE1_IDX1 ON TABLE1(FI_TABLE2);
CREATE TABLE TABLE2( ID DO_ID); ALTER TABLE TABLE2 ADD CONSTRAINT PK_TABLE2 PRIMARY KEY (ID);
CREATE VIEW VW_TABLE2( ID) AS SELECT ID FROM TABLE2;
INSERT INTO TABLE1(ID, FI_TABLE2) VALUES (1, 1); INSERT INTO TABLE1(ID, FI_TABLE2) VALUES (2, 1); INSERT INTO TABLE1(ID, FI_TABLE2) VALUES (3, 1); INSERT INTO TABLE1(ID, FI_TABLE2) VALUES (4, 1); INSERT INTO TABLE1(ID, FI_TABLE2) VALUES (5, 1); INSERT INTO TABLE1(ID, FI_TABLE2) VALUES (6, 2); INSERT INTO TABLE1(ID, FI_TABLE2) VALUES (7, 2); INSERT INTO TABLE1(ID, FI_TABLE2) VALUES (8, 2); INSERT INTO TABLE1(ID, FI_TABLE2) VALUES (9, 2); INSERT INTO TABLE1(ID, FI_TABLE2) VALUES (10, 2);
INSERT INTO TABLE2(ID) VALUES (1); INSERT INTO TABLE2(ID) VALUES (2); INSERT INTO TABLE2(ID) VALUES (3); INSERT INTO TABLE2(ID) VALUES (4); INSERT INTO TABLE2(ID) VALUES (5); INSERT INTO TABLE2(ID) VALUES (6); INSERT INTO TABLE2(ID) VALUES (7); INSERT INTO TABLE2(ID) VALUES (8); INSERT INTO TABLE2(ID) VALUES (9); INSERT INTO TABLE2(ID) VALUES (10);
ich habe ein Problem bei der Verwendung von Views in Interbase. Die Frage habe ich schon in mehreren Foren sowie direkt an Borland gestellt. Leider hat mir bisher niemand etwas dazu sagen können.
Umgebung: Interbase Server 5.6 / Interbase 6.5
Und zwar gibt es ein Performance-Problem, welches bei der Ausführung von SQL-Anweisungen mit Left Join auftritt, wenn ich eine Tabelle durch ein View ersetzen.
Dabei besteht das View nur aus einem SELECT * FROM TABELLE, so das die Ausführungszeit/Anzahl der Leseoperationen eigentlich gleich bleiben müsste. Dies ist jedoch nur bei einem normalen Join so.
Select-Anweisung mit der Tabelle:
SELECT *
FROM TABLE1 T1 LEFT JOIN TABLE2 T2 ON T1.FI_TABLE2 = T2.ID
Ergebnis-Zeilen: 10
Leseoperationen für Tabelle2: 10 Indexes Reads
Select-Anweisung mit dem View:
SELECT *
FROM TABLE1 T1 LEFT JOIN VW_TABLE2 T2 ON T1.FI_TABLE2 = T2.ID
Ergebnis-Zeilen: 10
Leseoperationen für Tabelle2: 100 Non-Indexes Reads
Es sieht so aus, dass im zweiten Fall für jede Ergebnis-Zeile jeweils das komplette View gelesen wird. Dies ist meiner Meinung nach nicht notwendig, der Plan für die beiden Abfragen sollte gleich sein. Lässt sich dies verhindern ? Oder gibt es hier einen Denkfehler ?
Gruß A.Meier
Metadaten:
CREATE DOMAIN DO_ID AS INTEGER NOT NULL;
CREATE TABLE TABLE1( ID DO_ID, FI_TABLE2 DO_ID); ALTER TABLE TABLE1 ADD CONSTRAINT PK_TABLE1 PRIMARY KEY (ID); CREATE INDEX TABLE1_IDX1 ON TABLE1(FI_TABLE2);
CREATE TABLE TABLE2( ID DO_ID); ALTER TABLE TABLE2 ADD CONSTRAINT PK_TABLE2 PRIMARY KEY (ID);
CREATE VIEW VW_TABLE2( ID) AS SELECT ID FROM TABLE2;
INSERT INTO TABLE1(ID, FI_TABLE2) VALUES (1, 1); INSERT INTO TABLE1(ID, FI_TABLE2) VALUES (2, 1); INSERT INTO TABLE1(ID, FI_TABLE2) VALUES (3, 1); INSERT INTO TABLE1(ID, FI_TABLE2) VALUES (4, 1); INSERT INTO TABLE1(ID, FI_TABLE2) VALUES (5, 1); INSERT INTO TABLE1(ID, FI_TABLE2) VALUES (6, 2); INSERT INTO TABLE1(ID, FI_TABLE2) VALUES (7, 2); INSERT INTO TABLE1(ID, FI_TABLE2) VALUES (8, 2); INSERT INTO TABLE1(ID, FI_TABLE2) VALUES (9, 2); INSERT INTO TABLE1(ID, FI_TABLE2) VALUES (10, 2);
INSERT INTO TABLE2(ID) VALUES (1); INSERT INTO TABLE2(ID) VALUES (2); INSERT INTO TABLE2(ID) VALUES (3); INSERT INTO TABLE2(ID) VALUES (4); INSERT INTO TABLE2(ID) VALUES (5); INSERT INTO TABLE2(ID) VALUES (6); INSERT INTO TABLE2(ID) VALUES (7); INSERT INTO TABLE2(ID) VALUES (8); INSERT INTO TABLE2(ID) VALUES (9); INSERT INTO TABLE2(ID) VALUES (10);
Comment