Announcement

Collapse
No announcement yet.

Frage an Hr. Kosch, Views und Left Joins

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Frage an Hr. Kosch, Views und Left Joins

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

  • #2
    Wie sieht denn der Plan für beide Abfragen aus?

    Ich glaube InterBase bekommt Schwierigkeiten mit dem Nutzen der Indizies wenn Views dabei sind.

    Kann man den ersten Plan bei der zweiten Anfrage angeben.

    Ich würde in ein join keine View aufnehmen (bei InterBase) und stattdessen eine view machen, die die EndErgebnis liefert

    Comment


    • #3
      Auf den verwendeten Plan und die SQL-Anweisungen habe ich leider keinen Einfluß. Im konkreten Fall soll die Sicht auf die Daten je nach Benutzer eingeschränkt werden. Dies soll durch den Austausch der Tabellen gegen Views erfolgen. Die Client-Anwendungen sollen bzw. können nicht angepaßt werden.

      Gruß A.Meie

      Comment


      • #4
        Hallo Andre,

        dann erzeuge Views die die Anwendung sieht, aber keine Views die auf Views aufsetzen, sondern nur auf Tabellen. Dann sollte es performanter sein

        Comment


        • #5
          Hallo Andreas,

          die Views setzen alle nur auf Tabellen auf. Die Performance-Probleme ergeben sich dann, wenn die Client-Anwendungen SQL-Anweisungen absetzen, die eine Left-Join Anweisung in Verbindung mit einem View enthalten.

          Gruß
          A. Meie

          Comment


          • #6
            Verstehe, sorry, und auf die SQL Befehle des Clients hast Du keinen Einfluß.

            Dann sieht es vermutlich schlecht aus, weil InterBase da durchaus suboptimal ist

            Comment

            Working...
            X