Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Postgres 10 parallel query внутри plpgsql функции / 4 сообщений из 4, страница 1 из 1
27.02.2018, 17:20
    #39608011
Skoffer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Postgres 10 parallel query внутри plpgsql функции
Вопрос:
можно ли обернуть SQL запрос в plpgsql функцию так, чтобы 10.2 использовала при этом parallel scan?

Кейс:
http://collabedit.com/nves6

Предпосылка:
https://wiki.postgresql.org/wiki/Parallel_Query…

Что я уже попробовал:
1. Возвращать курсор. Как вики и утверждала, параллельный select не работает.
2. Менять функцию на return table. Параллельный select все равно не работает.


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
load 'auto_explain';
SET auto_explain.log_min_duration = 0;
SET auto_explain.log_analyze = ON;
SET auto_explain.log_buffers = ON;
SET auto_explain.log_nested_statements = ON;

select version();

/*
                                                 version
---------------------------------------------------------------------------------------------------------
 PostgreSQL 10.2 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-18), 64-bit
(1 row)
*/

create table t as select n,'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz' txt from GENERATE_SERIES(1, 1000000) as t(n);
analyze t;

explain analyze select count(*) from t;
/*
                                                              QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------
 Finalize Aggregate  (cost=15554.55..15554.56 rows=1 width=8) (actual time=210.428..210.428 rows=1 loops=1)
   ->  Gather  (cost=15554.33..15554.54 rows=2 width=8) (actual time=210.332..210.420 rows=3 loops=1)
         Workers Planned: 2
         Workers Launched: 2
         ->  Partial Aggregate  (cost=14554.33..14554.34 rows=1 width=8) (actual time=202.036..202.036 rows=1 loops=3)
               ->  Parallel Seq Scan on t  (cost=0.00..13512.67 rows=416667 width=0) (actual time=0.061..133.659 rows=333333 loops=3)
 Planning time: 0.144 ms
 Execution time: 219.291 ms
(8 rows)
*/

CREATE OR REPLACE FUNCTION count_t()
RETURNS table(count bigint) AS
$body$
DECLARE
BEGIN
return query
select count(*) from t;
         
RETURN;

END
$body$
LANGUAGE 'plpgsql'
STABLE
CALLED ON NULL INPUT
SECURITY INVOKER
parallel safe
COST 10000;

select * from count_t();

/*
< 2018-02-27 08:47:03 EST:ignitemart:igniteadmin:27190 >LOG:  duration: 458.878 ms  plan:
        Query Text: select count(*) from t
        Aggregate  (cost=21846.00..21846.01 rows=1 width=8) (actual time=458.864..458.864 rows=1 loops=1)
          Buffers: shared hit=9346
          ->  Seq Scan on t  (cost=0.00..19346.00 rows=1000000 width=0) (actual time=0.027..250.312 rows=1000000 loops=1)
                Buffers: shared hit=9346
*/

CREATE OR REPLACE FUNCTION count_t_sql()
RETURNS table(count bigint) AS
$body$

select count(*) from t;
         
$body$
LANGUAGE sql
STABLE
CALLED ON NULL INPUT
SECURITY INVOKER
parallel safe
COST 100000;

select * from count_t_sql();

/*
< 2018-02-27 08:47:07 EST:ignitemart:igniteadmin:27190 >LOG:  duration: 200.076 ms  plan:
        Query Text: select * from count_t_sql();
        Finalize Aggregate  (cost=15554.55..15554.56 rows=1 width=8) (actual time=192.274..192.274 rows=1 loops=1)
          Buffers: shared hit=3721
          ->  Gather  (cost=15554.33..15554.54 rows=2 width=8) (actual time=192.222..192.266 rows=3 loops=1)
                Workers Planned: 2
                Workers Launched: 2
                Buffers: shared hit=3721
                ->  Partial Aggregate  (cost=14554.33..14554.34 rows=1 width=8) (actual time=184.039..184.039 rows=1 loops=3)
                      Buffers: shared hit=9346
                      ->  Parallel Seq Scan on t  (cost=0.00..13512.67 rows=416667 width=0) (actual time=0.032..117.308 rows=333333 loops=3)
                            Buffers: shared hit=9346
*/
...
Рейтинг: 0 / 0
27.02.2018, 21:31
    #39608163
vyegorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Postgres 10 parallel query внутри plpgsql функции
Skoffer,

В последнем приведённом примере параллельность присутствует. Что не так?
...
Рейтинг: 0 / 0
28.02.2018, 13:42
    #39608453
Skoffer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Postgres 10 parallel query внутри plpgsql функции
vyegorov,

в последнем примере функция languge sql. А в language plpgsql не работает.
...
Рейтинг: 0 / 0
28.02.2018, 14:50
    #39608513
vyegorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Postgres 10 parallel query внутри plpgsql функции
Skoffer,

Я склоняюсь к тому, что это из-за того, что ф-ция RETURNS TABLE. Если её переделать, то параллельность включается:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE OR REPLACE FUNCTION count_t_int8(OUT _cnt bigint) AS
$body$
DECLARE
BEGIN
select count(*) into _cnt from t;
RETURN;
END
$body$
LANGUAGE 'plpgsql'
STABLE PARALLEL SAFE;



Можно посмотреть на обсуждение фичи: http://postgr.es/m/CAOGQiiMfJ+4SQwgG=6CVHWoisiU0+7jtXSuiyXBM3y=A=eJzmg@mail.gmail.com]http://postgr.es/m/CAOGQiiMfJ 4SQwgG=6CVHWoisiU0 7jtXSuiyXBM3y=A=eJzmg@mail.gmail.com
Там также все примеры только для скалярных функций.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Postgres 10 parallel query внутри plpgsql функции / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]