Announcement

Collapse
No announcement yet.

Views ineinander verschachteln - guter oder schlechter Stil ?

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

  • Views ineinander verschachteln - guter oder schlechter Stil ?

    Hallo,

    ich habe einmal eine Frage zum Umgang mit Views auf dem SQL - Server, die ich mal versuche an einem Beispiel zu erklären:

    [highlight=sql]
    CREATE TABLE Belege
    (
    ...
    Belegart Int,
    Belegdatum DateTime,
    KundeID int
    ...
    )

    GO
    CREATE VIEW LetztesAngebot AS
    (
    SELECT KundeID, Max(Belegdatum) AS Belegdatum
    FROM Belege
    WHERE Belegart = 1 -- angebote
    GROUP BY KundeID
    )

    GO
    CREATE VIEW LetzteRechnung AS
    (
    SELECT Belegdatum, Max(Belegdatum) AS Belegdatum
    FROM Belege
    WHERE Belegart = 3 -- rechnungen
    GROUP BY KundeID
    )

    GO

    CREATE VIEW LetzterKontakt AS
    (
    SELECT COALESCE
    (LetzteRechnung.Belegdatum, LetztesAngebot.Belegdatum) AS Datum
    FROM
    Belege
    LEFT JOIN LetztesAngebot.KundeID = Belege.KundeID
    LEFT JOIN LetzteRechnung.KundeID = Belege.KundeID
    GO
    [/highlight]

    Meine Anwendung benutzt alle 3 Sichten, also LetztesAngebot und LetzteRechnung einzeln und dann auch in LetzterKontakt beide kombiniert.

    In Wirklichkeit sind die Selektionskriterien viel komplizierter und parametrisiert, das hier ist nur eine Prinzipskizze.
    Ich verspreche mir, dass, wenn die Einzelabfragen passen, auch die Gesamtabfrage passen muss.
    Außerdem finde ich den Ansatz strukturierter, als die (gleichen) umfangreichen WHERE - Klauseln in mehreren Abfragen pflegen zu müssen.

    Aber spricht designtechnisch und/oder performancetechnisch etwas grundsätzlich gegen solches Vorgehen?

    Eure Meinungen würden dazu interessieren; ich hoffe, ich konnte das halbwegs verständlich erklären.

    Danke
    Tino

    Edit:
    Sehe gerade
    [highlight=sql]
    SELECT KundeID,Max(Belegdatum) ...
    [/highlight]
    Wäre eine Lösung für mein kleines Problembeispiel - aber das meine ich hier nicht.
    Wie gesagt, es geht um das Verschachteln - eine Sicht in einer Sicht in einer Sicht .. auch über 4 - 5 Ebenen.
    Ich habs gleich!
    ... sagte der Programmierer.

  • #2
    Von der Modularität her betrachtet, nutze ich das auch ganz gerne, um mir extrem komplexe Subselects zu sparen. Man darf eben nur nicht den Überblick verlieren, welcher Filter/Join/Whatever auf welcher Ebene was steuert...

    Über 4 Ebenen finde ich jedoch ungewöhnlich. Bekannter ist mir das Anlegen von mehreren Views, die Daten aus den verschiedenen Systemen sammeln/anzeigen und das drüberlegen einer View, die die Daten joined.

    Comment


    • #3
      Hallo und danke für die Antwort.

      Bezüglich der Übersicht hast du recht, ich hab' mir schon eine Grafik erstellt, welche Sicht von welcher abhängt. Damit ist dieses Problem erstmal beherrschbar, man muss aber schon sehr aufpassen.

      Aus Performancesicht scheint mir die Lösung doch irgendwie suboptimal, die Abfragen dauern gefuhlt vergleichsweise lang. Aber das ist eher subjektiv.

      Ein anderes Problem, merke ich inzwischen, tritt auf, wenn sich Tabellenstrukturen ändern. Selbst bei einem SELECT * müssen dann alle abhängigen Views neu erstellt werden.

      Also werde ich diese Verschachtelung wohl eher etwas abspecken.


      Vlt. zum Hintergrund:
      Ich portiere gerade eine MS Access - Anwendung auf den SQL Server.
      Und man mag über Access geteilter Meinung sein: Die oben geschilderten Probleme kennt es nicht. Access löst (soweit ich das mit dem Profiler einschätzen kann) Abhängigkeiten zwischen Abfragen vor der Ausführung komplett bis auf die Tabellen auf.
      Auch das SELECT * wird 'durchgereicht' ohne dass die abhängigen Abfragen damit Probleme hätten.

      Danke!
      Ich freu' mich auf weitere Meinungen.
      Tino
      Ich habs gleich!
      ... sagte der Programmierer.

      Comment


      • #4
        Hat denn ein View Probleme damit wenn Du was an der Tabelle änderst? Das kann ich mir eigentlich nicht vorstellen. Ausser natürlich Du wirfst eine Spalte raus die explizit in der View verwendet wird. SELECT * sollte doch eigentlich genauso gehen oder nicht?
        Ausserdem JEDESMAL wenn Du auf den View zugreifst die hinterlegte SELECT Abfrage ausgeführt. Im Prinzip ist ein VIEW also praktisch nur eine gespeicherte SQL Abfrage.

        So kenne ich das zumindest aus Sicht der Oracle Datenbanken. Ich kann mir aber nicht vorstellen, dass das bei SQL Server anders ist

        Comment


        • #5
          Selbst bei einem SELECT * müssen dann alle abhängigen Views neu erstellt werden.
          Neue Felder in Tabellen werden generell nie automatisch in Views mit aufgenommen, auch nicht wenn SELECT * verwendet wird.

          Man muss die Sicht einmal bearbeiten oder einfacher sp_recompile + ein Select auf das View aufrufen.
          Olaf Helper

          <Blog> <Xing>
          * cogito ergo sum * errare humanum est * quote erat demonstrandum *
          Wenn ich denke, ist das ein Fehler und das beweise ich täglich

          Comment


          • #6
            Wieder was dazu gelernt Da sprechen die DB Experten

            Comment


            • #7
              sp_recompile
              Kannte ich auch noch nicht. Jetzt werden meine Wartungsscripts VIEL übersichtlicher.

              DANKE!

              Tino

              P.S. Wahrscheinlich, nein, sicher sollte man sich die Zeit nehmen, mal die Dokumentationen ausfühlich zu lesen ....
              Ich habs gleich!
              ... sagte der Programmierer.

              Comment

              Working...
              X