09.12.2022 17:15
polin11
 
Оптимизировать запрос с array_replace

Есть таблица Responsible, столбец Documents (тип bigint) ид. документа, User(тип []text) - массив пользователей.
Нужно при смене пользователя, обновить этого пользователя в массиве User.

Есть такой запрос
SQL код:
UPDATE
    
"Responsible"
SET
    
"User" array_replace(
        
"User"
    
,    'Петров'::text
    
,    'Иванов'::text
    
)
WHERE
    
"Documents" ANY('{3}') AND
    
array_position("User"'Петров'::textIS NOT NULL 
Но он много потребляет shared hit.
SQL код:
Update on "Responsible"  (cost=0.43..99802.28 rows=154773 width=74) (actual time=179.690..179.691 rows=0 loops=1)
  
Buffersshared hit=136800
  
->  Index Scan using "iDocuments" on "Responsible"  (cost=0.43..99802.28 rows=154773 width=74) (actual time=179.688..179.688 rows=0 loops=1)
        
Index Cond: ("Documents" ANY ('{3}'::bigint[]))
        
Filter: (array_position("User"'Петров'::textIS NOT NULL)
        
Rows Removed by Filter149754
        Buffers
shared hit=136800 

Используется индекс по Documents, хочется уменьшить потребление shared hit,
нет мыслей как это сделать.
Как-то переписать запрос или изменить индекс не получается
09.12.2022 20:19
vdm
 
1. Чем вам shared hit не нравится, разве "взято из кэша в памяти" это плохо?
2. Если после скана Documents отобраны сотни тысяч строк, то что вы хотите, по каждой строке будет дергаться массив User. Если эти User сами по себе не маленькие, можно попытаться их индексировать (индексы GIN) и фильтровать по User @> array['Петров']. Но мне вообще фильтры по элементам массивов кажутся плохой идеей.
Часовой пояс GMT +3, время: 22:43.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.