Eine einfache Lösung ist mit nur einer Zeile eine separate Tabelle zu haben, die letzte ID speichern Sie geholt.
Lassen Sie uns sagen, das ist Ihre „Tisch von Millionen von Zeilen“:
-- That's your table with million of rows
CREATE TABLE test_table (
id serial unique,
col1 text,
col2 timestamp
);
-- Data sample
INSERT INTO test_table (col1, col2)
SELECT 'test', generate_series
FROM generate_series(now() - interval '1 year', now(), '1 day');
Sie können die folgende Tabelle erstellen eine ID zu speichern:
-- Table to keep last id
CREATE TABLE last_query (
last_quey_id int references test_table (id)
);
-- Initial row
INSERT INTO last_query (last_quey_id) VALUES (1);
Dann mit der folgenden Abfrage, werden Sie immer Holen Sie 100 Zeilen, die nie aus der Originaltabelle abgerufen wurden, und führen Sie einen Zeiger in last_query
:
WITH last_id as (
SELECT last_quey_id FROM last_query
), new_rows as (
SELECT *
FROM test_table
WHERE id > (SELECT last_quey_id FROM last_id)
ORDER BY id
LIMIT 100
), update_last_id as (
UPDATE last_query SET last_quey_id = (SELECT MAX(id) FROM new_rows)
)
SELECT * FROM new_rows;
Zeilen werden nach der Reihenfolge der neuen IDs abgerufen (zuerst die ältesten Zeilen).
Mit "neuen Zeilen" meinen Sie neue Einsätze oder auch Updates? – Gab
@Gab Beide, neue Inserts werden gemacht und alte Zeilen werden ständig aktualisiert. –
Ja, aber "Ich möchte 100 neue Zeilen abfragen", sind das nur die Inserts oder auch die Zeilen, die kürzlich aktualisiert wurden? – Gab