sql >> Databáze >  >> RDS >> PostgreSQL

Postgres:použití časových razítek pro stránkování

Dovolte mi přepsat věci z komentářů k mé odpovědi. Chcete použít timestamp zadejte místo integer prostě proto, že přesně k tomu byl navržen. Provádění manuálních převodů mezi celými čísly časového razítka a timestamp objekty je jen bolest a nic nezískáte. A nakonec jej budete potřebovat pro složitější dotazy založené na datu a času.

Odpověď na otázku týkající se stránkování. Stačí zadat dotaz

SELECT *
FROM table_name
WHERE created < lastTimestamp
ORDER BY created DESC
LIMIT 30

Pokud je to první dotaz, nastavte řekněte lastTimestamp = '3000-01-01' . Jinak nastavíte lastTimestamp = last_query.last_row.created .

Optimalizace

Všimněte si, že pokud je stůl velký, pak ORDER BY created DESC nemusí být efektivní (zejména pokud je volán paralelně s různými rozsahy). V tomto případě můžete použít pohyblivá "časová okna", například:

SELECT *
FROM table_name
WHERE
    created < lastTimestamp
    AND created >= lastTimestamp - interval '1 day'

1 day interval je zvolen libovolně (vylaďte jej podle svých potřeb). Výsledky můžete také třídit v aplikaci.

Pokud výsledky nejsou prázdné, aktualizujte (ve své aplikaci)

lastTimestamp = last_query.last_row.created

(za předpokladu, že jste provedli třídění, jinak budete potřebovat min(last_query.row.created) )

Pokud jsou výsledky prázdné, zopakujte dotaz s lastTimestamp = lastTimestamp - interval '1 day' dokud něco neseženeš. Také musíte zastavit, pokud lastTimestamp stane se nízkou, tj. když je nižší než jakékoli jiné časové razítko v tabulce (které je třeba načíst předem).

To vše je za určitých předpokladů pro vložky:

  1. new_row.created >= any_row.created a
  2. new_row.created ~ current_time
  3. Distribuce new_row.created je víceméně jednotný

Předpoklad 1 zajišťuje, že stránkování povede ke konzistentním datům, zatímco předpoklad 2 je potřeba pouze pro výchozí 3000-01-01 datum. Předpoklad 3 je zajistit, abyste neměli velké prázdné mezery, když musíte zadávat mnoho prázdných dotazů.



  1. Jaká je maximální délka příkazu v Oracle

  2. Zabraňte rekurzivnímu spouštění v PostgreSQL

  3. Chyba tabulky MySQL neexistuje, ale existuje

  4. MySQL 1443:co to znamená?