powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Можно ли ускорить запрос
6 сообщений из 6, страница 1 из 1
Можно ли ускорить запрос
    #39283406
Доброе утро.

Есть таблица с пользователями user(id, name, reg_date, ...) кол-во строк, около 1 млн.
Есть таблица с платежами purchase(id, user_id, date, ...) , кол-во строк около 150 тыс.

есть запрос, который выбирает всех пользователей, которые когда-либо платили:

Код: sql
1.
2.
3.
4.
select ...  
from user
where user.reg_date::date between '2016-02-01' and '2016-03-01'
and exists(select * from purchase where purchase.user_id = player.user_id)



В плане выполнения вижу seq scan по всей таблице purchase .

Если посмотреть кол-во пользователей без exists , которые отбираются по фильтру user.reg_date::date between '2016-02-01' and '2016-03-01' , то их примерно 8 тыс.
Кол-во платежей для отобранных пользователей примерно 1.5 тыс.

В результирующей выборке примерно 370 строк .

Есть ли способ ускорить запрос?


Спасибо.
...
Рейтинг: 0 / 0
Можно ли ускорить запрос
    #39283411
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Вейник,

нужен explain analyze запроса (реального, в приведенном какой-то player непонятный есть) и описания (вывод \d+) участвующих в запросе таблиц.
...
Рейтинг: 0 / 0
Можно ли ускорить запрос
    #39283413
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Вейник,

А индексы какие есть на таблицах?

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Можно ли ускорить запрос
    #39283419
Alexius, Maxim Boguk:

Решил сделать тестовые таблицы.

Опишу все последовательно.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE public.user_test (
  user_id VARCHAR(32) NOT NULL,
  reg_date TIMESTAMP WITHOUT TIME ZONE,
  name VARCHAR(100),
  CONSTRAINT user_test_pkey PRIMARY KEY(user_id)
) 
WITH (oids = false);

CREATE INDEX user_test_day_idx ON public.user_test
  USING btree ((date_trunc('day'::text, reg_date)));




Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE public.purchase_test (
  id SERIAL,
  user_id VARCHAR(32),
  date TIMESTAMP(6) WITHOUT TIME ZONE,
  sum INTEGER,
  CONSTRAINT purchase_test_pkey PRIMARY KEY(id)
) 
WITH (oids = false);

CREATE INDEX purchase_test_user_idx ON public.purchase_test
  USING btree (user_id COLLATE pg_catalog."default");



Далее добавил тестовых данных, потом выполнил:

Код: sql
1.
2.
3.
4.
5.
explain analyze
select user_test.* 
from user_test
where user_test.reg_date::date between '2016-02-01' and '2016-03-01'
and exists(select * from purchase_test where purchase_test.user_id = user_test.user_id)



Результат:

"QUERY PLAN"
"Nested Loop (cost=5888.34..28780.72 rows=119 width=243) (actual time=120.059..992.727 rows=1363 loops=1)"
" -> HashAggregate (cost=5887.91..6126.01 rows=23810 width=17) (actual time=119.028..137.472 rows=50138 loops=1)"
" Group Key: (purchase_test.user_id)::text"
" -> Seq Scan on purchase_test (cost=0.00..5146.53 rows=296553 width=17) (actual time=0.024..48.758 rows=296553 loops=1)"
" -> Index Scan using user_test_pkey on user_test (cost=0.43..0.94 rows=1 width=243) (actual time=0.017..0.017 rows=0 loops=50138)"
" Index Cond: ((user_id)::text = (purchase_test.user_id)::text)"
" Filter: (((reg_date)::date >= '2016-02-01'::date) AND ((reg_date)::date <= '2016-03-01'::date))"
" Rows Removed by Filter: 1"
"Planning time: 0.680 ms"
"Execution time: 993.499 ms"
...
Рейтинг: 0 / 0
Можно ли ускорить запрос
    #39283422
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Вейник,

для данного запроса нужен обычный индекс по reg_date (приведение к date убрать), а не

Код: sql
1.
2.
CREATE INDEX user_test_day_idx ON public.user_test
  USING btree ((date_trunc('day'::text, reg_date)));



либо переписать запрос с использованием аналогичной конструкции с date_trunc в условии.
...
Рейтинг: 0 / 0
Можно ли ускорить запрос
    #39283432
Alexius, спасибо!
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Можно ли ускорить запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]