powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Быстрая выборка по содержимому поля int[]
2 сообщений из 2, страница 1 из 1
Быстрая выборка по содержимому поля int[]
    #38918081
Rickkk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, коллеги!

Существует таблица размера 41 ГБ в 100 млн записей.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE UNLOGGED TABLE tst_good_equivalent_links_total
(
  id bigint,
  parent_ge_id bigint,
  child_ge_id bigint,
  created_at timestamp without time zone,
  updated_at timestamp without time zone,
  is_replace_link smallint,
  is_direct_link integer,
  lvl integer,
  ge_type integer,
  cross_type integer,
  ipath integer[]
)
WITH (
  OIDS=FALSE
)



Пример:
Поле parent_ge_id содержит 1. Поле child_ge_id содержит 7.
В таком случае поле ipath содержит элементы, с помощью которых можно прийти от 1 к 7.
К примеру, массив ipath будет содержать 1,3,6,9,4,7.



В соответствии с условиями задания, мне нужно находить и удалять строки в tst_good_equivalent_links_total, поле ipath, которых будет содержать соответствующие одиночные связи.
Стоящие рядом элементы ipath и будут составлять одиночные связи, в вышеуказанном примере это 1-3,3-6,6-9,9-4,4-7.

Для поиска я выполняю запрос:


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select id,
parent_ge_id ,
child_ge_id
from public.tst_good_equivalent_links_total gelt
where 
cross_type=2 --связи автоматические
and
(15770615::text || '&' || 15827090::text)::query_int ~~ ipath  --данные узлы присутствуют в пути
and
abs(idx(ipath, 15770615::int)-idx(ipath, 15827090::int))=1 ; --в пути между ними прямая связь



Выборка 120000 строк.
Скорость поиска в ipath оставляет желать лучшего. Время вполнения 10-15 мин. План выполнения:

Bitmap Heap Scan on tst_good_equivalent_links_total gelt (cost=1091.81..357179.92 rows=419 width=16)
Recheck Cond: ('15770615 & 15827090'::query_int ~~ ipath)
Filter: ((cross_type = 2) AND (abs((idx(ipath, 15770615) - idx(ipath, 15827090))) = 1))
-> Bitmap Index Scan on gelt_ipath_idx (cost=0.00..1091.71 rows=99161 width=0)
Index Cond: ('15770615 & 15827090'::query_int ~~ ipath)


Размер индекса gelt_ipath_idx - 62 GB.


Как мне ускорить выборку строк по сегменту пути int[]?
...
Рейтинг: 0 / 0
Быстрая выборка по содержимому поля int[]
    #38918310
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RickkkЗдравствуйте, коллеги!

Существует таблица размера 41 ГБ в 100 млн записей.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE UNLOGGED TABLE tst_good_equivalent_links_total
(
  id bigint,
  parent_ge_id bigint,
  child_ge_id bigint,
  created_at timestamp without time zone,
  updated_at timestamp without time zone,
  is_replace_link smallint,
  is_direct_link integer,
  lvl integer,
  ge_type integer,
  cross_type integer,
  ipath integer[]
)
WITH (
  OIDS=FALSE
)



Пример:
Поле parent_ge_id содержит 1. Поле child_ge_id содержит 7.
В таком случае поле ipath содержит элементы, с помощью которых можно прийти от 1 к 7.
К примеру, массив ipath будет содержать 1,3,6,9,4,7.



В соответствии с условиями задания, мне нужно находить и удалять строки в tst_good_equivalent_links_total, поле ipath, которых будет содержать соответствующие одиночные связи.
Стоящие рядом элементы ipath и будут составлять одиночные связи, в вышеуказанном примере это 1-3,3-6,6-9,9-4,4-7.

Для поиска я выполняю запрос:


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select id,
parent_ge_id ,
child_ge_id
from public.tst_good_equivalent_links_total gelt
where 
cross_type=2 --связи автоматические
and
(15770615::text || '&' || 15827090::text)::query_int ~~ ipath  --данные узлы присутствуют в пути
and
abs(idx(ipath, 15770615::int)-idx(ipath, 15827090::int))=1 ; --в пути между ними прямая связь



Выборка 120000 строк.
Скорость поиска в ipath оставляет желать лучшего. Время вполнения 10-15 мин. План выполнения:

Bitmap Heap Scan on tst_good_equivalent_links_total gelt (cost=1091.81..357179.92 rows=419 width=16)
Recheck Cond: ('15770615 & 15827090'::query_int ~~ ipath)
Filter: ((cross_type = 2) AND (abs((idx(ipath, 15770615) - idx(ipath, 15827090))) = 1))
-> Bitmap Index Scan on gelt_ipath_idx (cost=0.00..1091.71 rows=99161 width=0)
Index Cond: ('15770615 & 15827090'::query_int ~~ ipath)


Размер индекса gelt_ipath_idx - 62 GB.


Как мне ускорить выборку строк по сегменту пути int[]?

приводите explain (analyze, buffers, timing, costs) вместо explain
и не забывайте включать track_io_timing
тогда можно будет сказать что то...

explain - только план по нему нельзя сказать обычно плохой он или хороший и в чем проблема может быть.

PS: если у вас на сервере не 128Gb памяти я бы предположил что в работе с диском.

--Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Быстрая выборка по содержимому поля int[]
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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