172 похожих чатов

Коллеги, товарищи, есть вопрос ) имеется таблица https://pastebin.com/RZEfkTKY имеется запрос к ней

SELECT min(id) as MN FROM statistics.app_track WHERE starts_at>='2021-09-20 07:19:29';

имеется индекс на соответствующее поле, но запрос выполняется неожиданно долго (даже если дату сдвинуть на день назад от сейчас)
експлейн говорит следующее :

Result (cost=39.44..39.45 rows=1 width=4)
InitPlan 1 (returns $0)
-> Limit (cost=0.44..39.44 rows=1 width=4)
-> Index Scan using app_track_pkey on app_track (cost=0.44..61175133.00 rows=1568476 width=4)
Index Cond: (id IS NOT NULL)
Filter: (starts_at >= '2021-09-20 07:19:29'::timestamp without time zone)

то есть запрос использует первичный ключ, а не индекс по дате

в то время как запрос

with result as
( SELECT id as MN FROM statistics.app_track WHERE starts_at>='2021-10-4 07:19:29' )
select min(MN) from result as MN
работает по индексу по дате и результат выдает почти моментально,
но использовать нужно первый вариант, технические ограничения

пробовал выполнить реиндендекс индекса по дате, анализ таблицы, даже снял дамп данных (40Г) и восстановил на другой хост с этой же схемой (эмулировал вакуумфул, так сказать), не помогло, план запроса не меняется

может кто проконсультировать, почему выбирается такой план, и можно ли с этим как-то побороться ?

14 ответов

11 просмотров

Попробуйте вариант с order by mn limit 1

Сергей-Кравчук Автор вопроса
Valery
Попробуйте вариант с order by mn limit 1

на главное не повлияло test=# explain SELECT min(id) as MN FROM statistics.app_track WHERE starts_at>='2021-09-20' order by mn limit 1 ; QUERY PLAN ----------------------------------------------------------------------------------------------------------- Limit (cost=38.76..38.76 rows=1 width=4) InitPlan 1 (returns $0) -> Limit (cost=0.44..38.74 rows=1 width=4) -> Index Scan using app_track_pkey on app_track (cost=0.44..61175133.00 rows=1597229 width=4) Index Cond: (id IS NOT NULL) Filter: (starts_at >= '2021-09-20 00:00:00'::timestamp without time zone) -> Sort (cost=38.76..38.76 rows=1 width=4) Sort Key: ($0) -> Result (cost=38.74..38.75 rows=1 width=4) (9 rows)

Сергей Кравчук
на главное не повлияло test=# explain SELECT min(...

Уберите min(), она заменяется на то что предложено

Я бы предложыл обновить postgres, это ошыбка планировщика какая-то. Настолько грубая, что она ужэ должна быть давно исправлена.

Сергей Кравчук
psql (13.4 (Ubuntu 13.4-4.pgdg20.04+1))

Не, значит что-то ещё не то.

А, туплю, это жэ не min(дата), ё-моё. Ладно, тренировочка чтобы проснуться, да.

Ну, то есть, ошыбка есть -- но не такая ужасная, как я подумал. Можно попробовать коррелированную статистику (id, starts_at) добавить. https://www.postgresql.org/docs/13/planner-stats.html#PLANNER-STATS-EXTENDED

Сергей-Кравчук Автор вопроса
Ilya Anfimov
Ну, то есть, ошыбка есть -- но не такая ужасная, к...

почитаю, попробую, но пока индекс с инклуд создается )

И да, альтэрнатива у него -- считать все значения по указанной дате и отсортировать по id. Это. понятно, много работы, какие-то, видимо, десятки или сотни тысяч строк (не знаю, сколько у вас там реально).

Сергей-Кравчук Автор вопроса
Ilya Anfimov
Ну, то есть, ошыбка есть -- но не такая ужасная, к...

все правильно ? test=# CREATE STATISTICS statistics.statistics_app_track_stat_on_starts_at_and_id (dependencies) ON starts_at, id FROM statistics.app_track; CREATE STATISTICS test=# explain SELECT min(id) as MN FROM statistics.app_track WHERE starts_at>'2021-09-12 07:19:29'; QUERY PLAN ----------------------------------------------------------------------------------------------------------- Result (cost=28.46..28.47 rows=1 width=4) InitPlan 1 (returns $0) -> Limit (cost=0.44..28.46 rows=1 width=4) -> Index Scan using app_track_pkey on app_track (cost=0.44..61262227.80 rows=2186085 width=4) Index Cond: (id IS NOT NULL) Filter: (starts_at > '2021-09-12 07:19:29'::timestamp without time zone) (6 rows) test=# analyze statistics.app_track; ANALYZE test=# explain SELECT min(id) as MN FROM statistics.app_track WHERE starts_at>'2021-09-12 07:19:29'; QUERY PLAN ----------------------------------------------------------------------------------------------------------- Result (cost=29.85..29.86 rows=1 width=4) InitPlan 1 (returns $0) -> Limit (cost=0.44..29.85 rows=1 width=4) -> Index Scan using app_track_pkey on app_track (cost=0.44..61507309.35 rows=2091089 width=4) Index Cond: (id IS NOT NULL) Filter: (starts_at > '2021-09-12 07:19:29'::timestamp without time zone) (6 rows) если, то не помогло (

Сергей Кравчук
все правильно ? test=# CREATE STATISTICS statisti...

ndistinct, dependencies на pkey вообще безсмысленнен по-моему.

Сергей Кравчук
все правильно ? test=# CREATE STATISTICS statisti...

И размеры статистики можно попинать. statistic_target там увеличить.

Похожие вопросы

Обсуждают сегодня

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
короче сгенерила мне эта штука код на ассемблере: struc string val { common local .value dq .value .value: if ~val eq db val end if db 0 } fo...
Vi Chapmann Chapmann
12
Всем привет! Массив вводится с клавиатуры, кол-во элементов неизвестно, поэтому я указал arr db 100 dup(?) С нахождением максимума проблем нет, а вот минимум почему-то всегд...
En Vind Av Sorg
11
Помогите, пожалуйста, делаю программу для для подсчёта корней квадратного уравнения, знаю, что есть куча недочётов, недоработок, но основная проблема в том, что почему-то при ...
NYC
13
#include <stdio.h> int main(void) { int n; scanf("%d", &n); int digits1[n] = {0}; int digits2[n] = {0}; я не могу таким образом заранее массив нулями заполнить?
Linus
12
в сях есть множество как в питоне? для удаление дубликатов
Linus
25
читать файл максимально быстро? странный вопрос))
zamtmn
53
я про форму записи. смысл указывать что 8 байтный регистр 8 байт?
Aiwan \ (•◡•) / _bot
10
Вроде бы вопрос уже заезжанный, но тем не менее У меня есть функция menu() которая выводит набор возможных действий, а затем спрашивает у пользователя что он хотел бы сделать....
David Golovatin
3
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Карта сайта