Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PostgreSQL > Оптимизировать запрос с array_replace


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

Есть такой запрос 
Код

UPDATE
    "Responsible"
SET
    "User" = array_replace(
        "User"
    ,    'Петров'::text
    ,    'Иванов'::text
    )
WHERE
    "Documents" = ANY('{3}') AND
    array_position("User", 'Петров'::text) IS NOT NULL

    
Но он много потребляет shared hit.

Код

Update on "Responsible"  (cost=0.43..99802.28 rows=154773 width=74) (actual time=179.690..179.691 rows=0 loops=1)
  Buffers: shared 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", 'Петров'::text) IS NOT NULL)
        Rows Removed by Filter: 149754
        Buffers: shared hit=136800

        

Используется индекс по Documents, хочется уменьшить потребление shared hit,
нет мыслей как это сделать.
Как-то переписать запрос или изменить индекс не получается

Автор: Akina 9.12.2022, 17:45
Ну вообще-то разумнее нормализовать структуру и уйти от хранения массива. Ну или хотя бы вместо массива юзеров хранить массив ссылок в таблицу юзеров - впрочем, такой подход разгрузит только эту операцию..

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)