В 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