-
Query Optimierung
Hallo ich habe eine Query gebastelt, die scheinbar eine sehr Hohe Laufzeitkomplexität besitzt.
Es sind zwei Tabellen
therapydata1(id,pid,diag1,diag2,diag3,diag4,diag5, diag6)
therapycosts(id,diag,costs)
Jetzt soll jeder Behandlung aus therapydata (also für jede id) die Kosten(aus Therapycosts) aufaddiert werden für jede Diagnose diag1 bis diag6 . Ungefähr so:
Code:
SELECT z.id, z.pid, sum(z.costs) AS Gesamtkosten, z.behandlungsdauer, z.versorgungsebene FROM
(
SELECT m.id, m.pid, t.diag, t.costs, m.behandlungsdauer, m.versorgungsebene
FROM therapydata1 m Join mc_therapycosts t ON t.diag=m.diag1 or t.diag=m.diag2
or t.diag=m.diag3 or t.diag=m.diag4 or t.diag=m.diag5 or t.diag=m.diag6
) z
GROUP BY z.pid
Wie gesagt dauert das Ewigkeiten. Außerdem muss ich sogar noch zwei weitere therapydatentabellen berücksichtigen ! Das will ich mit UNION ALL machen . Das wird aber dann auch nochmal lange dauern
-
Hoi
Was für eine Datenbank hast du denn am Laufen?
Lg
Christian
-
lass doch mal ein explain über deine query laufen und zeig uns die ausgabe,
damit kannst du sehen wo der flaschenhals hängt.
Vermutungen, spontane Ideen:
index auf therapycosts(diag) ist erstellt?
wenn diag ein PK in therapycosts ist und dein DBMS Daten nur aus nem Primärschlüssel entnehmen kann, könnte man vllt überlegen den PK auf therapycosts(diag,costs) zu legen.
wenn diag kein PK in therapycosts ist und es sehr viele Zeilen mit demselben diag gibt und diese Tabelle sehr statisch ist (heißt selten geändert wird) könnte man überlegen Redundanz einzubauen und die Gesamtkosten pro diag schon vorzuberechnen so in der Art:
Code:
create table therapycosts_calc ( diag int unsigned primary key, costs int unsigned);
insert into therapycosts_calc ( diag, costs ) select diag, sum(costs) from therapycosts group by diag;
und da kann man evtl auch bisschen geschwindigkeit (zu gunsten von speicherbedarf) rausholen wenn man den primary key von therapycosts_calc auf diag,costs setzt (gerht nur wenn das dbms auch die daten ausm pk holen kann, mysql innodb kannn das afaik)