powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / оптимизация запроса jsonb
1 сообщений из 1, страница 1 из 1
оптимизация запроса jsonb
    #39725421
breath
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всем привет

в таблице collection поле rules типа jsonb может содержать типа такую структуру (есть и другие поля обычного типа)

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
{
  "groups": [
    {
      "groupId": 2294,
      "attributes": []
    },
    {
      "groupId": null,
      "attributes": [
        {
          "condition": "EQ",
          "attributeId": 5,
          "attributeValue": "JBL"
        }
      ]
    },
    {
      "groupId": null,
      "attributes": [
        {
          "condition": "CONTAINS_SUBSTR",
          "attributeId": 9,
          "attributeValue": "Reflect Fit"
        }
      ]
    }
  ]
}



такой запрос работает не очень быстро (записей в таблице может быть много), два раза проход по массиву groups получается
Код: plsql
1.
2.
3.
4.
5.
6.
select distinct
	collection_id,
	jsonb_array_elements( rules ->'groups' )->>'groupId' as group_id,
	jsonb_array_elements( jsonb_array_elements( rules ->'groups' )#>'{attributes}' )->>'attributeId' as attribute_id
from
	collection



попытка оптимизации этого куска
Код: javascript
1.
	jsonb_array_elements( jsonb_array_elements( rules ->'groups' )#>'{attributes}' )->>'attributeId' as attribute_id



последовательно его расписать чтобы не проходить два раза, скорость вроде прибавилась, но результат в этом случае отличается, не все группы проходятся в итоге результ меньше

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
with groups as (
select
	collection_id,
	jsonb_array_elements( rules_wo_operators ->'groups' ) as groups_data
from
	collection ),
group_data as (
select 
	collection_id,
	groups_data ->>'groupId' as group_id,
	jsonb_array_elements( groups_data ->'attributes') as attributes_data ----тут уже отличается
from
	groups ),
attribute_data as (
select
	collection_id,
	group_id,
	attributes_data ->>'attributeId' as attribute_id
from
	group_data ),
attribute_rules as (
select
	collection_id,
	group_id,
	attribute_id
from
	attribute_data )
select * from attribute_rules



где ошибка ?

пробовал индексировать это jsonb поле, первый запрос не ускорился
Код: plsql
1.
2.
3.
4.
5.
6.
7.
CREATE INDEX collection_rules_groups_gin_idx ON collection USING gin ((rules-> 'groups'));
CREATE INDEX collection_rules_attrs_gin_idx ON collection USING gin ((rules-> 'attributeId'));

CREATE INDEX collection_rules_groups_gin_idx ON collection (((rules->> 'groupId')::int));
CREATE INDEX collection_rules_attrs_gin_idx ON collection (((rules->> 'attributeId')::int));

REINDEX TABLE collection;



вобщем как ускорить первый запрос, индексироваем или переписыванием

спасибо
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / оптимизация запроса jsonb
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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