xom`s pinion - Tom Hnatovsky Blog

Dlohotrvající OFFSET v PostgreSQL

29. května 2012 PostgreSQL nekomentováno

PostgreSQL tutoriálNedá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.

Pole komentáře: zmenšit / zvětšit

Jméno:

Email: (Gravatar ID)

Web:

Barva trávy (otázka proti robotům):

© 2004-2012 Tom Hnatovsky - Všechna práva vyhrazena