Zakładając, że mamy do czynienia z dużym stołem , indeks częściowy może pomóc:
CREATE INDEX tbl_created_recently_idx ON tbl (created_at DESC)
WHERE created_at > '2013-09-15 0:0'::timestamp;
Jak już się przekonałeś:schodzenie czy wznoszenie nie ma tutaj większego znaczenia. Postgres może skanować wstecz z prawie taką samą prędkością (wyjątki dotyczą indeksów wielokolumnowych).
Zapytanie o użycie tego indeksu:
SELECT * FROM tbl
WHERE created_at > '2013-09-15 0:0'::timestamp -- matches index
ORDER BY created_at DESC
LIMIT 1;
Chodzi o to, aby indeks znacznie mniejszy , więc buforowanie i konserwacja powinno być łatwiejsze.
- Musisz wybrać sygnaturę czasową, która na pewno będzie mniejsza niż ostatnia.
- Od czasu do czasu należy tworzyć indeks, aby odciąć stare dane.
- Warunek musi być
IMMUTABLE
.
Tak więc jednorazowy efekt pogarsza się z czasem. konkretny problem jest stanem zakodowanym na sztywno:
WHERE created_at > '2013-09-15 0:0'::timestamp
Automatyzacja
Od czasu do czasu możesz ręcznie aktualizować indeks i zapytania. Lub zautomatyzujesz to za pomocą funkcji takiej jak ta:
CREATE OR REPLACE FUNCTION f_min_ts()
RETURNS timestamp LANGUAGE sql IMMUTABLE AS
$$SELECT '2013-09-15 0:0'::timestamp$$
Indeks:
CREATE INDEX tbl_created_recently_idx ON tbl (created_at DESC);
WHERE created_at > f_min_ts();
Zapytanie:
SELECT * FROM tbl
WHERE created_at > f_min_ts()
ORDER BY created_at DESC
LIMIT 1;
Zautomatyzuj odtwarzanie za pomocą zadania cron lub jakiegoś zdarzenia opartego na wyzwalaczu. Twoje zapytania mogą teraz pozostać takie same. Ale musisz odtworzyć wszystkie indeksy używanie tej funkcji w jakikolwiek sposób po jej zmianie. Po prostu upuść i utwórz każdy.
Pierwszy ..
... sprawdź, czy naprawdę trafiasz tym w gardło.
Spróbuj, czy prosty indeks DROP index ... ; CREATE index ...
wykonuje pracę. Wtedy twój indeks mógł być rozdęty. Twoje ustawienia automatycznego odkurzania mogą być wyłączone.
Lub wypróbuj VACUUM FULL ANALYZE
aby cały stół wraz z indeksami był w nieskazitelnym stanie i sprawdź ponownie.
Inne opcje obejmują zwykłe ogólne dostrajanie wydajności i indeksy pokrywające, w zależności od tego, co faktycznie pobierasz z tabeli.