Ускорить ORDER BY при упорядочении по временной переменной?

avatar
aa bb
9 августа 2021 в 05:26
24
1
1

Мне было интересно, как я могу ускорить этот запрос с помощью индексов или чего-то еще, если это вообще возможно. Я не знаю, возможно ли это с моим текущим запросом.

Запрос выглядит следующим образом:

SELECT
  id,
  metric,
  out_metric,
  run_every,
  last_downsampled_window,
  query,
  (last_updated + run_every)::bigint - $1 AS time_until_update
FROM downsamplers
WHERE worker_id = $2
ORDER BY time_until_update ASC
LIMIT 1;

Где $1 — текущая метка времени unix в нано. А $2 — это просто идентификатор.

А схема таблицы выглядит так:

CREATE TABLE downsamplers (
  id serial,
  metric text,
  out_metric text,
  run_every bigint,
  last_downsampled_window bigint,
  last_updated bigint NOT NULL,
  worker_id int,
  query jsonb
)

В основном я использую этот запрос, чтобы получить элемент от субдискретизаторов с самым ранним time_until_update.

Источник
Aval Sarri
9 августа 2021 в 05:31
0

Создание индекса для worker_id поможет, если таблица содержит много данных.

aa bb
9 августа 2021 в 05:33
0

Отметил благодарности. Однако я надеялся оптимизировать аспект time_until_update.

a_horse_with_no_name
9 августа 2021 в 05:39
0

Это не "временная переменная" - это псевдоним столбца

Ответы (1)

avatar
Jonathan Willcock
9 августа 2021 в 05:38
1

Одним из подходов может быть создание сгенерированного столбца на last_updated + run_every. Затем вы можете создать индекс для этого сгенерированного столбца. Наконец, в вашем запросе сделайте заказ только в сгенерированном столбце. Порядок в сгенерированном столбце будет точно таким же, как порядок - $1, поскольку $1 фактически является константой и, следовательно, влияет на все значения в одинаковой степени, таким образом, не оказывая никакого влияния на порядок.