Ако приемем, че имаме работа сголяма маса , частичен индекс може да помогне:
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;
Въпросът тук е да се направи индексът много по-малък , така че би трябвало да е по-лесно за кеширане и поддръжка.
- Трябва да изберете времева марка, която гарантирано е по-малка от най-новата.
- Трябва да създавате отново индекса от време на време, за да отрежете старите данни.
- Условието трябва да е
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
за да приведете цялата си таблица плюс индекси в идеално състояние и проверете отново.
Други опции включват обичайната обща настройка на производителността и покриващи индекси, в зависимост от това, което всъщност извличате от таблицата.