PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Indeksowane ORDER BY z LIMIT 1

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.

  1. Musisz wybrać sygnaturę czasową, która na pewno będzie mniejsza niż ostatnia.
  2. Od czasu do czasu należy tworzyć indeks, aby odciąć stare dane.
  3. 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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. pgAdmin III Dlaczego wyniki zapytań są skracane?

  2. LOWER() – Konwertuj na małe litery w PostgreSQL

  3. STWÓRZ JĘZYK plpython3u – PostgreSQL 9.6

  4. Widzisz i czyścisz pamięć podręczną/bufory Postgresa?

  5. Jak przełączać bazy danych w psql?