xom`s pinion - Tom Hnatovsky Blog
Dlohotrvající OFFSET v PostgreSQL
Nedávno jsem řešil problém s pomalým vykonáváním dotazů v PgSQL databázi při použití klauzule OFFSET. Pokud pustíte select s několika joiny nad tabulkou s deseti tisíci záznamy a ještě z něj chcete data dostávat postupně (pomocí limitu a offsetu) – například v případě stránkování, tak se pěkně načekáte.
Problém spočívá v tom, že Postgre aplikuje limit a offset nad celou výstupní tabulkou a to mu něco potrvá.
Problematický zápis
SELECT
a.*, b.neco, c.neco
FROM
tabulka a
LEFT JOIN
dalsi_tabulka b ON b.id_a = a.id
LEFT JOIN
extra_tabulka c ON c.id_a = a.id
LIMIT 100
OFFSET 90000
Celý nastíněný problém lze vyřešit dalším joinem – takovým, který poběží pouze nad sloupečkem id hlavní tabulky.
SELECT
a.*, b.neco, c.neco
FROM
(SELECT id FROM tabulka LIMIT 100 OFFSET 90000) AS pomocna_tabulka
JOIN
tabulka a
LEFT JOIN
dalsi_tabulka b ON b.id_a = a.id
LEFT JOIN
extra_tabulka c ON c.id_a = a.id
Časová úspora je u opravdu velkých tabulek neuvěřitelná.
Komentovat
Článek zatím nebyl komentován. Podělte se svým názorem.