Announcement

Collapse
No announcement yet.

anzuhängende Tabelle zunächst filtern

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

  • anzuhängende Tabelle zunächst filtern

    hallo leute,
    ich weiß nicht genau wie man sowas nennt, aber ich versuch mal mein Problem zu erklären.

    Es geht nämlich um JOINs. Wenn ich so einen Code habe:

    Code:
    SELECT *
    FROM  tbl AS t1
    INNER JOIN tbl AS t2	ON t2.a = 1019 AND t2.b = t1.b
    Soweit ich das verstanden habe, fügt SQL zu jedem Eintrag aus t1 dann die komplette tabelle an, und filtert nach den entsprechenden Kriterien. Das Problem nun ist: Er soll nicht bei jedem Eintrag aus t1 jedes mal die gesamte Liste immer wieder durchlaufen, sondern nur einen Teil davon. Ich weiß z.B., dass nur die Einträge, die bei t2.a den Wert 1019 haben durchgesucht werden müssen.
    Meine Frage ist nun: wie kann ich SQL sagen, dass er an t1 eine gefilterte Tabelle anhängen soll, damit nicht immer alle Einträge überprüft werden müssen.

    Die Idee wäre dann sowas wie
    Code:
    SELECT *
    FROM  tbl AS t1
    INNER JOIN tbl_gefiltert AS t2	ON t2.b = t1.b
    Ich hoffe es ist klar was ich erreichen will. Bei mehreren Hundert/Tausend Einträgen liesse sich bestimmt jede menge Rechenzeit sparen.

    Da gibt es doch bestimmt eine Möglichkeit, oder?

  • #2
    Hi,

    dazu gibt es die WHERE Bedingung:
    Code:
    SELECT *
    FROM  tbl AS t1
    INNER JOIN tbl AS t2 ON t2.b = t1.b
    WHERE t2.a = 1019
    Das Statement ist aber nur als Beispiel gedacht oder? Denn eine Tabelle mit sich selbst auf das gleiche Feld zu joinen ist relativ sinnfrei.

    Dim
    Zitat Tom Kyte:
    I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

    Comment


    • #3
      Hi dimitri,
      habe es gerade mal mit der WHERE Bedingung ausprobiert. Bei der Ergebnisausgabe gibt es keine Unterschiede, jedoch dauert die Abfrage dadurch ein wenig länger. Hast du vielleicht noch eine andere Idee?

      Und ja es ist als Beispiel gedacht. Es geht mir also nur um das Prinzip, das eine anzuhängende Tabelle (JOIN) zuvor gefiltert werden soll.

      Ich weiß zwar nicht ob es große Unterschiede macht, aber ich habe es mit SQLite ausprobiert. Soweit ich auch das verstanden habe, ist eine abgespeckte Variante von mySQL.

      Gibt es vielleicht noch irgendwelche zusätzlichen Paramater oder sowas für die JOINs? Denn bis jetzt kenne ich nur LEFT JOIN und INNER JOIN.

      Comment


      • #4
        Habe gerade mal einen Test durchgeführt. In Bezug auf das obige Beispiel, habe ich aus der vollen Tabelle "tbl" nur die benötigten Einträge ausgefiltert und in eine neue Tabelle gleicher Struktur "tbl_gefiltert" hineingepackt.

        Wenn ich jetzt die gefilterte Tabelle joine, also etwa so (nur Beispiel)

        Code:
        SELECT *
        FROM  tbl AS t1
        INNER JOIN tbl AS t2 ON t2.a = 1019 AND t2.b = t1.b
        hat sich meine Abfragedauer in etwa halbiert, also 50% Geschwindigkeitsgewinn!
        Es ist bestimmt zwar von der Länge der Tabelle abhängig. Bei mir sind es insgesamt fast 1000 Einträge und in der gefilterten dann nur noch knapp über 200. In einigen Fällen wird es wohl noch schneller gehen und in anderen evtl nicht so ganz schnell, aber auf jeden Fall schneller.
        Die Leute die sich SQL bzw. das joinen ausgedacht hatten, haben doch bestimmt diese Geschwindigkeitsbremse beachtet und eine Möglichkeit eingebaut sie zu umgehen.

        Ich habe mal versucht die mySQL documentation zu JOIN durchzulesen. Allerdings ist sie ziemlich schwer zu lesen und mir kommt es vor, als ob es da keine richtige Struktur gäbe. Als Alternative habe ich mir auch mal die SQLite documentation angeschaut. Da gibt es auch schöne Diagramme. Werde aus den Bildern aber auch nicht wirklich schlau. Habe daran gedacht verschachtelte JOINS zu benutzen, aber bis jetzt hat bei mir nichts geklappt.

        Die Idee mit den seperaten Tabellen ist ja nicht der sinn der Sache, vor allem da es nicht klar ist wie viele Tabellen gemacht werden sollen, da es auf die Daten ankommt. Außerdem müsste man sie auch ständig updaten.

        Comment


        • #5
          Hallo dundanox,

          warum willst du dem Server bei der Optimierung der Join-Abfrage ins Handwerk pfuschen? Du solltest einfach dafür sorgen, dass die Zugriffe auf die Tabelle optimal möglich sind - Stichwort: Index.

          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

          Working...
          X