Announcement

Collapse
No announcement yet.

SQL-Query Design-Frage: a*b vs. a+b

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

  • SQL-Query Design-Frage: a*b vs. a+b

    Hallo,

    ich stehe gerade vor der Problemstellung, riesige Datenmengen aus zwei Tabellen abzufragen und zu verknüpfen. Sagen wir, Tabelle A hat a Zeilen, Tabelle B hat b Zeilen.
    Verknüpft sind beide über eine eindeutige ID, so dass eine Query mit einem INNER JOIN ON A.id=B.id denkbar ist. Das Problem ist jetzt aber, dass eine solche Query brutal viele Daten erzeugt (a*b Zeilen mit ziemlich vielen redundaten Einträgen), die ich je nach Anwendungsfall über das Netz jagen muss. Besser wäre es aus dieser Sicht, den JOIN in der Applikation auf der Seite des Clients zu machen und nur (a+b) Zeilen über das Netzwerk zu schicken. Allerdings ist dies naturgebenerweise wieder ineffektiv. Ein DB-Server auf Clientseite steht mir leider auch nicht zur Verfügung.

    Meine Frage: Gibt es irgendeine Technik für eine Zwischendrin-, d.h. Kompromisslösung?

    Danke, mssqler

  • #2
    Das hängt halt stark von Deinem Frontend und dessen Logik ab.

    In .NET (ADO.NET) gibt es die Möglichkeit, 2 Datasets separat zu laden und die client-seitig zu JOINen.

    Andere Variant ist, den SQLCompact oder eineres Mini-DBSystem auf dem Client zu nutzen und dort zu cachen.

    Oder sich hinsetzen und eine bessere Frontend-Logik finden.
    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


    • #3
      Originally posted by mssqler View Post
      ... so dass eine Query mit einem INNER JOIN ON A.id=B.id denkbar ist. ... viele Daten erzeugt (a*b Zeilen...
      Kann nicht sein. Entweder sind sie verknüft so das bei einem INNER JOIN maximal die kleinere Anzahl der Datensätze zurückkommt wie in "A" oder "B" ist.

      Originally posted by mssqler View Post
      .. mit ziemlich vielen redundaten Einträgen), die ich je nach Anwendungsfall über das Netz jagen muss.
      Wirklich redundant? Entweder mit DISTINCT vom Server entfernen lassen oder irgendwas passt mit deinem Datenmodell nicht.

      Comment


      • #4
        Danke für die Antworten.

        Auf das Datenmodell habe ich keinen Einfluss. Leider auf das Frontend auch nicht. Dies lässt halt nur einfache SQL-Queries zu, die an den Remoteserver geleitet werden.

        Mal ganz vereinfacht dargestellt:

        Tab 1:
        Id subId Name
        1 1 a
        1 2 b
        1 3 c
        2 1 x
        2 2 y
        2 1 z

        Tab 2:
        Id subId FeatureCode
        1 1 5
        1 2 7
        2 1 3
        2 2 4

        würde liefern:

        a 5
        a 7
        b 5
        b 7
        c 5
        c 7
        x 3
        ...
        z 4

        also 12 Zeilen, das sind schon einmal mehr als die 10 Ursprungszeilen.
        Also, zugegeben, a*b ist der worst case, also O(a*b).

        Wenn jetzt eine dritte oder gar vierte Tabelle ins Spiel kommt, kann man ich ja ganz schnell ausmalen, das #Zeilen explorieren werden.

        Was ich im Augenblick mache, ist, dass ich alle Tabellen einzeln, aber sortiert übertrage und dann in der Client-Applikation mit ineinander geschachtelten Schleifen joine. Der Code ist jedoch unübersichtlich, da das SQL-Interface dummerweise nur eine begrenzte Anzahl von Zeilen auf einmal laden kann.

        Abhilfe könnte eigentlich nur eine bessere Query-Technik auf SQL-Basis schaffen.

        Comment


        • #5
          Hallo,
          Originally posted by mssqler View Post
          ...Abhilfe könnte eigentlich nur eine bessere Query-Technik auf SQL-Basis schaffen.
          Dann hast du das Prinzip von SQL nicht verstanden. Wenn du nur die Daten abrufst die du auch benötigst, dann wird keine einzige Zeile zuviel zum Client übertragen!

          Was du offensichtlich abfragst ist eine Kreuzprodukt und das ergibt naturgemäß eine sehr große Datenmenge. Wenn du das Kreuzprodukt nicht brauchst, dann frag kein Kreuzprodukt ab!
          Wenn du in deiner Abfrage für dein Datenmodell nur die Id zugrunde legst, dann ist diese Beziehung in keinster Weise "eindeutig" und du erhälst ein Kreuzprodukt. Ist evtl noch die subId zu berücksichtigen?
          [highlight=sql]
          select a.Name, b.FeatureCode
          from Tab1 a
          inner join Tab2 b on b.Id = a.Id and b.subId = a.subId
          [/highlight]
          Würde liefern:
          5 a
          7 b
          3 x
          4 y

          Ist das eher gewünscht?

          Gruß Falk
          Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

          Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

          Comment


          • #6
            Ich benötige das Kreuzprodukt für die weitere Auswertung der Daten.
            Das Problem, das ich hier eigentlich anschneiden wollte, ist der tradeoff bzgl. Netzwerk und Rechenzeit auf Clientseite. Die von Dir vorgeschlagene Query ist schon klar (bis auf die Bedingung SubId=SubId). Wie gesagt, für das Datenmodell auf Serverseite kann ich nichts.

            Danke und Gruß,
            mssqler

            PS: Ich denke schon, dass ich das SQL-Prinzip verstanden habe, auch wenn ich halt noch nicht alle Kniffe kenne, aber für meine Anwendung wird es wohl dann auch keine geben.

            Comment


            • #7
              Originally posted by mssqler View Post
              Ich benötige das Kreuzprodukt für die weitere Auswertung der Daten....
              Auf der anderen Seite beschwerst du dich aber das du zu viele und redundante Daten erhälst! Was willst du nun eigentlich?
              Solange du dich nicht konkret äußerst worin die "Redundanz" besteht und mit welcher Abfrage du zu Viele Daten erhälst bzw. wie dein "Wunschergebnis" aussehen sollte, wird dir hier keiner helfen können.

              Gruß Falk
              Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

              Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

              Comment


              • #8
                Originally posted by Falk Prüfer View Post
                Auf der anderen Seite beschwerst du dich aber das du zu viele und redundante Daten erhälst! Was willst du nun eigentlich?
                Solange du dich nicht konkret äußerst worin die "Redundanz" besteht und mit welcher Abfrage du zu Viele Daten erhälst bzw. wie dein "Wunschergebnis" aussehen sollte, wird dir hier keiner helfen können.

                Gruß Falk
                Du hast Recht. Ich kann und darf (NDA!) das Problem nur sehr abstrahiert darstellen und bei dieser Abstraktion habe ich wohl zu viel Kontextwissen vorausgesetzt.

                Klarerweise enthalten meine Tabellen mehr als die angegeben drei Spalten, und daher rührt die Redundanz.

                Comment

                Working...
                X