Функция postgres: обновление больших таблиц и удаление - PullRequest
0 голосов
/ 06 марта 2019

postgres версия: 9.3 postgres.conf: все конфигурации по умолчанию

У меня есть 2 таблицы, A и B, обе имеют по 1 миллиону строк.Существует функция postgres, которая будет выполняться каждые 2 секунды, она будет обновлять таблицу A, в которой идентификаторы в массиве (размер массива = 20), а затем удалять строки в таблице B. Функция DB показана ниже:

CREATE OR REPLACE FUNCTION test_function (ids NUMERIC[])
RETURNS void AS $$
BEGIN
  UPDATE A a
  SET status = 'begin', end_time = (NOW() AT TIME ZONE 'UTC')
  WHERE a.id = ANY (ids);

  DELETE FROM B b
  WHERE b.aid = ANY (ids)
    AND b.status = 'end';
END;
$$ LANGUAGE plpgsql;

Анализ показывает, как показано ниже:

explain(ANALYZE,BUFFERS,VERBOSE) select test_function('{2,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}');

ПЛАН ЗАПРОСА

Result  (cost=0.00..0.26 rows=1 width=0) (actual time=14030.435..14030.436 rows=1 loops=1)
   Output: test_function('{2,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}'::numeric[])
   Buffers: shared hit=24297 read=26137 dirtied=20
 Total runtime: 14030.444 ms
(4 rows)

Мой вопрос:

  1. В производствесреда, почему эту функцию нужно выполнить не более чем за 7 секунд до успеха;
  2. Когда эта функция выполняется, этот процесс съедает до 60%.-> Это ключевая проблема

РЕДАКТИРОВАТЬ: Анализ каждого отдельного sql:

explain(ANALYZE,VERBOSE,BUFFERS) UPDATE A a SET status = 'begin', 
end_time = (now()) WHERE a.id = ANY 
('{2,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}');

                                                                           QUERY PLAN                                                                               

 Update on public.A a  (cost=0.45..99.31 rows=20 width=143) (actual time=1.206..1.206 rows=0 loops=1)
   Buffers: shared hit=206 read=27 dirtied=30
   ->  Index Scan using A_pkey on public.a a  (cost=0.45..99.31 rows=20 width=143) (actual time=0.019..0.116 rows=19 loops=1)
         Output: id, start_time, now(), 'begin'::character varying(255), xxxx... ctid
         Index Cond: (t.id = ANY('{2,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}'::integer[]))
         Buffers: shared hit=75 read=11
 Trigger test_trigger: time=5227.111 calls=1
 Total runtime: 5228.357 ms
(8 rows)
 explain(ANALYZE,BUFFERS,VERBOSE) DELETE FROM 
B b WHERE tq.aid = ANY 
('{2,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}');
                                                            QUERY PLAN                                                                
 Delete on B b  (cost=0.00..1239.11 rows=20 width=6) (actual time=6.013..6.013 rows=0 loops=1)
   Buffers: shared hit=448
   ->  Seq Scan on B b (cost=0.00..1239.11 rows=20 width=6) (actual time=6.011..6.011 rows=0 loops=1)
         Output: ctid
         Filter: (b.aid = ANY ('{2,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}'::bigint[]))
         Rows Removed by Filter: 21743
         Buffers: shared hit=448
 Total runtime: 6.029 ms
(8 rows)

загрузка ЦП

Перед звонком: enter image description here

Часто выполняемые операции: enter image description here

...