Announcement

Collapse
No announcement yet.

Unterabfrage beschleunigen

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

  • Unterabfrage beschleunigen

    Hallo,

    es geht um folgendes Problem im Rahmen meiner Doktorarbeit:

    Ich bin in einer Pharmadatenbank auf der Suche nach Produktgruppen, die einen bestimmten Wirkstoff beinhalten (z.B. alle Medikamente mit Paracetamol).

    Die einzelnen Datenbanken haben folgende Struktur:

    DB mmi_produktgruppen: PRODUCTGROUPID | (GRUPPEN)NAME | PRODUCTID
    Hier steht z.B. "Ben-u-ron" als eine Produktgruppe, von der es viele verschiedene Versionen (andere Dosierungen) gibt.

    DB mmi_produkte: PRODUCTID | (MEDI)NAME
    Hier ist jedes Produkt einzeln beeinhaltet (Bsp: Ben-u-ron 1000 mg, Ben-u-ron 500 mg, ...). Es ist aber sinnvoller, bei einer Suche zunächst nur die zugehörige Produktgruppe anzuzeigen und nicht direkt diese Datenbank zu verwenden.

    DB mmi_p2w: PRODUCTID | MOLECULEID
    Hier ist für jedes Medikament vermerkt, welche Inhaltsstoffe es hat. Bei "Ben-u-ron" steht dort entsprechend "Paracetamol".

    DB mmi_wirkstoffe MOLECULEID | (WIRKSTOFF)NAME


    Die IDs sind jeweils vom Typ MID, die Namen sind Strings.


    Ich verwende folgendes Query zur Abfrage:

    SELECT `PRODUCTGROUPID`,`NAME` FROM `mmi_produktgruppen` WHERE PRODUCTGROUPID IN
    (SELECT DISTINCT `PRODUCTGROUPID` FROM `mmi_produkte` WHERE `PRODUCTID` IN
    (SELECT `PRODUCTID` FROM `mmi_p2w` WHERE `MOLECULEID` = 298))


    298 ist hier die MOLECULEID von Paracetamol.
    Es sind Indizes über die alle verwendeten Spalten erstellt. Werden 2 Spalten abfragt, besteht ein Index über beide Spalten.



    Mein Problem ist: Eine Abfrage dauert zwischen 10 und 15 Sekunden, weil es beispielsweise mehrere 100 Medikamente gibt, die Paracetamol beinhalten.
    Wie kann ich den Query so optimieren, das er in < 1 Sek. läuft?

    Vielen Dank!
    -user6957

  • #2
    Hallo,
    Originally posted by user6957 View Post
    ...Wie kann ich den Query so optimieren, das er in < 1 Sek. läuft?
    Eine Garantie für < 1 Sek. wird dir niemand geben können, aber sinnvoll wäre es auf jeden Fall das zweite IN durch einen JOIN zu ersetzen und dann ggfs. das erste IN durch ein EXISTS. Aber obs dann < 1 Sek. läuft kannst du nur probieren...

    Hinweis: Formatierung von SQL in Beiträgen

    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


    • #3
      Hallo,

      [ergänzend zum Beitrag von Falk Prüfer]

      ich würde die Anfrage verkürzen indem ich die Tabelle "mmi_produkte" nicht einbeziehen würde, also SQL:

      SELECT DISTINCT `PRODUCTGROUPID`,`NAME` FROM `mmi_produktgruppen` WHERE `PRODUCTID` IN (SELECT `PRODUCTID` FROM `mmi_p2w` WHERE `MOLECULEID` = 298)

      Der Grund liegt darin, dass in der Tabelle "mmi_produktgruppen"zu jeder "PRODUCTID" eine "PRODUCTGROUPID" geben kann oder muss. Da der "Name" der Tabelle "mmi_produkte" weder für das Resultat noch für die Selektionsbedingung benötigt wird, kann man diese Tabelle vernachlässigen. Die "PRODUCTID" muss in allen Tabellen gleich sein, da man ansonsten Inkonsistenzen in den Daten hätte.

      Comment


      • #4
        Wie wärs hiermit?

        @A. Fuss: bei deinem Vorschlag fehlt glaub ich der name der Produktgruppe...

        [highlight=sql]
        SELECT `PRODUCTGROUPID`,`NAME`
        FROM `mmi_produktgruppen` GRP
        JOIN `mmi_produkte`PRO
        ON GRP.`PRODUCTGROUPID`=PRO.`PRODUCTGROUPID`
        JOIN `mmi_p2w` P2W
        ON P2W.`PRODUCTID`=PRO.`PRODUCTID`
        WHERE
        WHERE `MOLECULEID` = 298
        [/highlight]

        Comment

        Working...
        X