postgres: несколько операторов regexp_replace - производительность? - PullRequest
0 голосов
/ 19 июня 2020

В PostgreSQL, я пытаюсь сделать большое количество regexp_replaces и ищу способы его ускорить. Я попытался проверить, быстрее ли вложение операторов, чем передача результата в переменную, а затем выполнение следующей замены результата.

Я вижу около 10% экономии времени для второго вложенного пример ниже. Это то, что можно было бы ожидать, и рекомендуемый способ сделать несколько regexp_replaces?

В качестве альтернативы, есть ли что-то совершенно другое, что я должен попробовать? фактическая функция выглядит.

не вложено (это не имеет смысла, просто генерируются случайные символы для тестирования производительности):

do
$$
declare 
  i record;
  _output text;
begin
  for i in 1..100000 loop
    _output = regexp_replace((SELECT string_agg(c, '')
                            FROM (SELECT c
                            FROM regexp_split_to_table(
                            'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890',
                             ''
                           ) c
                            ORDER BY random()
                            LIMIT 6
                           ) AS q)
     ,'A|B|C|1',' ','g');

    _output = regexp_replace(_output,' ','x','g');


  end loop;
end;
$$
;

вложено (без цели, это просто генерирует случайные символы для тестирование производительности):

do
$$
declare 
  i record;
  _output text;
begin
  for i in 1..100000 loop

    _output = regexp_replace(regexp_replace((SELECT string_agg(c, '')
                            FROM (SELECT c
                            FROM regexp_split_to_table(
                            'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890',
                             ''
                           ) c
                            ORDER BY random()
                            LIMIT 6
                           ) AS q)
     ,'A|B|C|1',' ','g'),' ','x','g');


  end loop;
end;
$$
;

фактическая функция выглядит так, однако существует более двух замен, и она предназначена для запуска в таблицах с миллионами записей:

CREATE OR REPLACE FUNCTION address_appartment_cleanup_test(_input text)
  RETURNS text
  LANGUAGE plpgsql
AS
$body$

BEGIN
 _input = (SELECT regexp_replace(_input,'^APARTMENT ','APT ', 'g'));
 _input = (SELECT regexp_replace(_input,'^SUITE ','STE ', 'g'));
RETURN _input;
END;
$body$
  VOLATILE
  COST 100;


SELECT address_appartment_cleanup_test('APARTMENT 10'); -- desired output APT 10
SELECT address_appartment_cleanup_test('SUITE 10');     -- desired output STE 10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...