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.