jb_alvarado
Lieutenant
- Registriert
- Sep. 2015
- Beiträge
- 576
Hallo Allerseits,
ich habe hier eine Datenbankabfrage die mir zu lange dauert:
Die Abfrage dauert ca. 900ms, Grund dafür ist hauptsächlich diese Zeile:
Das Problem ist nur, dass ich die Abfrage dynamisch veränderbar machen muss, Z.B. mit verschiedenen
Fallen euch noch Optimierungsmöglichkeiten ein, wie ich alles in einer Abfrage drin haben kann und die Rückgabe dennoch schneller geht?
ich habe hier eine Datenbankabfrage die mir zu lange dauert:
SQL:
SELECT mf.*,
MAX(pbe."start") AS "last_start",
(ml.id, ml."name") AS "language",
(mc.id, mc.name) AS "category",
(case when ms1.id > 0 then (ms1.id, ms1."name") end) AS "series",
(ms2.id, ms2."path") AS "source",
(mt.id, mt."name") AS "type",
array_agg((case when ms3.id > -1 then (ms3.id, ms3."name") end)) AS "speaker"
FROM media_files mf
LEFT JOIN program_block_entries pbe ON pbe.media_id = mf.id
INNER JOIN media_languages ml ON ml.id = mf.lang_id
INNER JOIN media_categories mc ON mc.id = mf.category_id
LEFT JOIN media_series ms1 ON ms1.id = mf.series_id
INNER JOIN media_sources ms2 ON ms2.id = mf.source_id
INNER JOIN media_types mt ON mt.id = mf.type_id
LEFT JOIN media_file_speakers mfs ON mfs.media_file_id = mf.id
LEFT JOIN media_speakers ms3 ON ms3.id = mfs.media_speaker_id
GROUP BY mf.id, mc.id, ml.id, ms1.id, ms2.id, mt.id, pbe.id
ORDER BY mf.name ASC
LIMIT 20 OFFSET 0
Die Abfrage dauert ca. 900ms, Grund dafür ist hauptsächlich diese Zeile:
MAX(pbe."start") AS "last_start",
. Wenn ich die Abfrage aufteile in zwei Abfragen, die Erste ohne last_start
und den zugehörigen JOIN, die Zweite dann nur mit last_start
gefiltert nach den `media_id`s dauert das ganze nur noch ca. 40-60ms.Das Problem ist nur, dass ich die Abfrage dynamisch veränderbar machen muss, Z.B. mit verschiedenen
ORDER BY
Klauseln. Wenn ich nun nach last_start
sortieren möchte, wäre es nötig, dass ich diese Zeile natürlich auch in der Abfrage drin habe.Fallen euch noch Optimierungsmöglichkeiten ein, wie ich alles in einer Abfrage drin haben kann und die Rückgabe dennoch schneller geht?