Juve: Abfrage optimierbar?

Glück auf!

DBMS: PostGreSQL 8.2
Ich habe folgende Abfrage:

  
SELECT inhalt.relevanz, inhalt.did FROM inhalt WHERE inhalt.wid IN (SELECT woerterbuch.id FROM woerterbuch WHERE wort='wort')  

Die Tabelle inhalt hat ca. 9,6 Mio. Einträge, das Wörterbuch umfasst ca. 780000 Wörter, trotzdem scheint mir diese Abfrage ziemlich lange zu dauern. Das Subselect braucht nur wenige ms, also muss der Flaschenhals in der Gesamtabfrage liegen. Ein Join ist (wenig überraschend) noch deutlich langsamer. Hat jemand eine Idee, wie ich das performanter hinbekommen kann?
Danke schonmal für alle Vorschläge!

Gruß,
der Juve

  1. yo,

    Hat jemand eine Idee, wie ich das performanter hinbekommen kann?

    die abfrage selbst scheint mir wenig potential zu haben, allerdings bieten sich diverse optimierungsmöglichkeiten um die abfrage herum. die erste frage ist natürlich, welche indexe hast du gesetzt ?

    ich denke auch, dass es weniger an der unterabfrage liegt, aber das ist leicht zu testen, die ergebnismenge der unterabfrage kopieren und einfach mal "hart codiert" in die abfrage einfügen.

    und nicht vergessen, sich den ausführungsplan anschauen, wie das dbms die ergebnismenge überhaupt ermittelt.

    Ilja

    1. Glück auf!

      die erste frage ist natürlich, welche indexe hast du gesetzt ?

      Die DB ist wie folgt aufgebaut:
      Tab. woerterbuch: id(int)(pkey) | wort(text)(btreeindex)
      inhalt: wid(int)(pkey) | did(int)(pkey) | relevanz(double)
      domains: id(int)(pkey) | name(text) | [einige andere statistische Daten]
      Darüber hinaus Fremdschlüsselbeziehungen zwischen woerterbuch.id-inhalt.wid sowie domain.id-inhalt.did
      Ich bin jetzt zwar nicht der Megaexperte, aber ich glaube, viel mehr kann man vom Design her nicht machen.

      und nicht vergessen, sich den ausführungsplan anschauen, wie das dbms die ergebnismenge überhaupt ermittelt.

      Ich finde im PGadmin eine Funktion "Abfrage zerlegen", ist das sowas? Und wie interpretiere ich das? Ist zwar bunt, mit vielen tollen Grafiken, sagt mir aber ansonsten eher wenig... :)

      Gruß,
      der Juve

      1. yo,

        das problem könnte an dem zusammengesetzten pkey in der tabelle inhalt liegen, je nachdem in welcher reihenfolge der index angelegt wurde, bzw. wie mysql damit umgehen kann. ich würde die spalte inhalt.wid noch mal einzeln indizieren und schauen, ob es zu veränderungen kommt.

        Ich finde im PGadmin eine Funktion "Abfrage zerlegen", ist das sowas? Und wie interpretiere ich das? Ist zwar bunt, mit vielen tollen Grafiken, sagt mir aber ansonsten eher wenig... :)

        nein, das hat wenig mit dem ausführungsplan zu tun, der ist eine funkionalität von mysql, der dir anzeigt, wie genau die abfrage druch das dbms ausgeführt wird, quasi eine wegbeshreibung, wie es zu dem ergebnis der abfrage kommt. ein wenig stöbern in der mysql doku sollte dich schnell darauf bringen.

        Gruß
        Ilja

        1. Glück auf!

          ich würde die spalte inhalt.wid noch mal einzeln indizieren und schauen, ob es zu veränderungen kommt.

          Ja, das bringt tatsächlich noch paar Prozent mehr Geschwindigkeit.

          Ich finde im PGadmin eine Funktion "Abfrage zerlegen", ist das sowas? Und wie interpretiere ich das? Ist zwar bunt, mit vielen tollen Grafiken, sagt mir aber ansonsten eher wenig... :)
          nein, das hat wenig mit dem ausführungsplan zu tun, der ist eine funkionalität von mysql, der dir anzeigt, wie genau die abfrage druch das dbms ausgeführt wird, quasi eine wegbeshreibung, wie es zu dem ergebnis der abfrage kommt. ein wenig stöbern in der mysql doku sollte dich schnell darauf bringen.

          Zwar habe ich (wie im ersten Posting geschrieben) PostgreSQL und nicht MySQL, habe aber auch dort was äquivalentes gefunden. Jetzt werde ich mich noch etwas intensiver mit der vacuum-Funktion beschäftigen, und dann wird da vielleicht doch noch was draus ;)
          Ilja, schonmal vielen Dank für deine Hilfe bis hierher, vielleicht hab ich demnächst ja noch ne Nachfrage. :)

          Gruß,
          der Juve