За последние 24 часа нас посетили 20969 программистов и 1495 роботов. Сейчас ищет 581 программист ...

Оптимизировать запрос с array_replace

Тема в разделе "PostgreSQL", создана пользователем polin11, 9 дек 2022.

  1. polin11

    polin11 Активный пользователь

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

    Есть такой запрос
    Код (Text):
    1. UPDATE
    2.     "Responsible"
    3. SET
    4.     "User" = array_replace(
    5.         "User"
    6.     ,    'Петров'::text
    7.     ,    'Иванов'::text
    8.     )
    9. WHERE
    10.     "Documents" = ANY('{3}') AND
    11.     array_position("User", 'Петров'::text) IS NOT NULL
    Но он много потребляет shared hit.

    Код (Text):
    1. Update on "Responsible"  (cost=0.43..99802.28 rows=154773 width=74) (actual time=179.690..179.691 rows=0 loops=1)
    2.   Buffers: shared hit=136800
    3.   ->  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)
    4.         Index Cond: ("Documents" = ANY ('{3}'::bigint[]))
    5.         Filter: (array_position("User", 'Петров'::text) IS NOT NULL)
    6.         Rows Removed by Filter: 149754
    7.         Buffers: shared hit=136800

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