PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Индексирано ORDER BY с LIMIT 1

Ако приемем, че имаме работа сголяма маса , частичен индекс може да помогне:

CREATE INDEX tbl_created_recently_idx ON tbl (created_at DESC)
WHERE created_at > '2013-09-15 0:0'::timestamp;

Както вече разбрахте:слизането или изкачването тук едва ли има значение. Postgres може да сканира назад с почти същата скорост (изключенията важат за индекси с няколко колони).

Заявка за използване на този индекс:

SELECT * FROM tbl
WHERE  created_at > '2013-09-15 0:0'::timestamp -- matches index
ORDER  BY created_at DESC
LIMIT  1;

Въпросът тук е да се направи индексът много по-малък , така че би трябвало да е по-лесно за кеширане и поддръжка.

  1. Трябва да изберете времева марка, която гарантирано е по-малка от най-новата.
  2. Трябва да създавате отново индекса от време на време, за да отрежете старите данни.
  3. Условието трябва да е IMMUTABLE .

Така еднократният ефект се влошава с времето. Специфичният проблем е твърдо кодираното условие:

WHERE created_at > '2013-09-15 0:0'::timestamp

Автоматично

Можете да актуализирате индекса и вашите заявки ръчно от време на време. Или го автоматизирате с помощта на функция като тази:

CREATE OR REPLACE FUNCTION f_min_ts()
  RETURNS timestamp LANGUAGE sql IMMUTABLE AS
$$SELECT '2013-09-15 0:0'::timestamp$$

Индекс:

CREATE INDEX tbl_created_recently_idx ON tbl (created_at DESC);
WHERE created_at > f_min_ts();

Запитване:

SELECT * FROM tbl
WHERE  created_at > f_min_ts()
ORDER  BY created_at DESC
LIMIT  1;

Автоматизирайте отдих с cron задание или някакво събитие, базирано на тригери. Вашите запитвания могат да останат същите сега. Но виетрябва да пресъздадете всички индекси използване на тази функция по какъвто и да е начин след промяната й. Просто пуснете и създайте всеки един.

Първо ..

... тествайте дали наистина удряте гърлото на бутилката с това.

Опитайте дали прост DROP index ... ; CREATE index ... върши работата. Тогава вашият индекс може да е бил раздут. Настройките ви за автоматично вакуумиране може да са изключени.

Или опитайте VACUUM FULL ANALYZE за да приведете цялата си таблица плюс индекси в идеално състояние и проверете отново.

Други опции включват обичайната обща настройка на производителността и покриващи индекси, в зависимост от това, което всъщност извличате от таблицата.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Основно наблюдение на PostgreSQL – част 1

  2. Съхранените процедури изпълняват ли се в транзакция на база данни в Postgres?

  3. Postgresql агрегатен масив

  4. деактивирайте БЕЛЕЖИТЕ в изхода на psql

  5. Как да управлявате вашите PostgreSQL бази данни от ClusterControl CLI