PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Postgres :utiliser des horodatages pour la pagination

Permettez-moi de réécrire les choses des commentaires à ma réponse. Vous souhaitez utiliser timestamp tapez au lieu de integer simplement parce que c'est exactement pour cela qu'il a été conçu. Faire des conversions manuelles entre les entiers d'horodatage et timestamp objets est juste une douleur et vous ne gagnez rien. Et vous en aurez éventuellement besoin pour des requêtes plus complexes basées sur la date et l'heure.

Pour répondre à une question sur la pagination. Vous faites simplement une requête

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

S'il s'agit de la première requête, vous définissez par exemple lastTimestamp = '3000-01-01' . Sinon, vous définissez lastTimestamp = last_query.last_row.created .

Optimisation

Notez que si la table est grande alors ORDER BY created DESC peut ne pas être efficace (surtout s'il est appelé en parallèle avec différentes plages). Dans ce cas, vous pouvez utiliser des "fenêtres horaires" mobiles, par exemple :

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

Le 1 day l'intervalle est choisi arbitrairement (ajustez-le à vos besoins). Vous pouvez également trier les résultats dans l'application.

Si les résultats ne sont pas vides, vous mettez à jour (dans votre application)

lastTimestamp = last_query.last_row.created

(en supposant que vous avez fait le tri, sinon vous prenez min(last_query.row.created) )

Si les résultats sont vides, vous répétez la requête avec lastTimestamp = lastTimestamp - interval '1 day' jusqu'à ce que vous récupériez quelque chose. Aussi, vous devez arrêter si lastTimestamp devient trop faible, c'est-à-dire lorsqu'il est inférieur à tout autre horodatage de la table (qui doit être prérécupéré).

Tout cela est sous certaines hypothèses pour les insertions :

  1. new_row.created >= any_row.created et
  2. new_row.created ~ current_time
  3. La distribution de new_row.created est plus ou moins uniforme

L'hypothèse 1 garantit que la pagination donne des données cohérentes tandis que l'hypothèse 2 n'est nécessaire que pour le 3000-01-01 par défaut Date. L'hypothèse 3 consiste à s'assurer que vous n'avez pas de grandes lacunes vides lorsque vous devez émettre de nombreuses requêtes vides.