sql >> データベース >  >> RDS >> PostgreSQL

Postgres:ページ付けにタイムスタンプを使用

    コメントから私の答えに書き直させてください。 timestampを使用したい integerの代わりに入力する それがまさにそれが設計されたものだからです。タイムスタンプ整数とtimestampの間で手動変換を行う オブジェクトはただの苦痛であり、あなたは何も得ません。そして、最終的には、より複雑な日時ベースのクエリに必要になります。

    改ページについての質問に答えるため。クエリを実行するだけです

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

    最初のクエリの場合は、たとえばlastTimestamp = '3000-01-01'を設定します。 。それ以外の場合は、lastTimestamp = last_query.last_row.createdを設定します 。

    最適化

    テーブルが大きい場合は、ORDER BY created DESCに注意してください。 効率的でない可能性があります(特に、異なる範囲で並列に呼び出された場合)。この場合、移動する「タイムウィンドウ」を使用できます。例:

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

    1 day 間隔は任意に選択されます(必要に応じて調整してください)。アプリで結果を並べ替えることもできます。

    結果が空でない場合は、(アプリで)更新します

    lastTimestamp = last_query.last_row.created
    

    (並べ替えが完了していると仮定します。それ以外の場合は、min(last_query.row.created)を使用します。 )

    結果が空の場合は、lastTimestamp = lastTimestamp - interval '1 day'を使用してクエリを繰り返します。 あなたが何かをフェッチするまで。また、lastTimestampの場合は、停止する必要があります 低くなります。つまり、テーブル内の他のタイムスタンプ(プリフェッチする必要があります)よりも低くなります。

    これらはすべて、挿入に関するいくつかの仮定の下にあります。

    1. new_row.created >= any_row.created および
    2. new_row.created ~ current_time
    3. new_row.createdの配布 多かれ少なかれ均一です

    仮定1は、ページネーションによって一貫したデータが得られることを保証しますが、仮定2は、デフォルトの3000-01-01にのみ必要です。 日にち。仮定3は、多くの空のクエリを発行する必要があるときに、大きな空のギャップがないことを確認することです。



    1. AndroidSQLiteMultiTableデータベースの開発

    2. テーブルに外部キーを挿入する方法

    3. WAMPサーバーでMySQLに接続するにはどうすればよいですか?

    4. SQLServer2014ワークロードに推奨されるIntelプロセッサ