Pomala SQL funkce se SECURITY DEFINER

2 views
Skip to first unread message

Zbynek Vanzura

unread,
Jan 15, 2021, 5:49:58 AM1/15/21
to postgr...@googlegroups.com
Pri optimalizaci jedne funkce jsem si vsiml ze SQL funkce je vyrazne
pomalejsi nez stejna PL/pgSQL funkce v pripade ze je pouzito SECURITY
DEFINER.

Konkretni priklad je na https://blog.80.cz/postgresql.html vcetne
vysledku explain analyze. Jinak je to testovano na 12.1

Nevim jestli jsem narazil na nejakou anomalii vztahujici se na ten
konkretni prikladd a nebo jestli je vhodnejsi pri pouziti SECURITY
DEFINER vzdy pouzit PL/pgSQL funkci a nebo jestli mam neco blbe v
Postgresu nastaveno.

Zbynek Vanzura
hep...@gmail.com

Pavel Stehule

unread,
Jan 15, 2021, 6:06:04 AM1/15/21
to PostgreSQL-cz


pá 15. 1. 2021 v 11:49 odesílatel Zbynek Vanzura <hep...@gmail.com> napsal:
SQL funkce jsou rychlejsi nez PL/pgSQL vlastne v jedinem pripade - pokud se inlajnuji - pokud se rozpusti v tom celkovem vyrazu. Pokud nedojde k inliningu, tak jsou naopak pomalejsi, protoze nepouzivaji plancache. Mam pocit, ze SECURITY DEFINER zmenou kontextu (zmena uzivatele) blokuje inlining.

Naucte se obcas pouzivat EXPLAIN VERBOSE

CREATE OR REPLACE FUNCTION s(a int, b int)
RETURNS int AS $$
  SELECT $1 + $2
$$ LANGUAGE sql;

postgres=# EXPLAIN VERBOSE SELECT s(i,i) FROM generate_series(1,1) g(i);
┌─────────────────────────────────────────────────────────────────────────────────┐
│                                   QUERY PLAN                                    │
╞═════════════════════════════════════════════════════════════════════════════════╡
│ Function Scan on pg_catalog.generate_series g  (cost=0.00..0.02 rows=1 width=4) │
  Output: (i + i)                                                               │
│   Function Call: generate_series(1, 1)                                          │
└─────────────────────────────────────────────────────────────────────────────────┘
(3 rows)

postgres=# CREATE OR REPLACE FUNCTION s(a int, b int)
RETURNS int AS $$
  SELECT $1 + $2
$$ LANGUAGE sql SECURITY DEFINER;

CREATE FUNCTION
postgres=# EXPLAIN VERBOSE SELECT s(i,i) FROM generate_series(1,1) g(i);
┌─────────────────────────────────────────────────────────────────────────────────┐
│                                   QUERY PLAN                                    │
╞═════════════════════════════════════════════════════════════════════════════════╡
│ Function Scan on pg_catalog.generate_series g  (cost=0.00..0.26 rows=1 width=4) │
│   Output: s(i, i)                                                               │
│   Function Call: generate_series(1, 1)                                          │
└─────────────────────────────────────────────────────────────────────────────────┘
(3 rows)

Osobne SECURITY DEFINER funkce pouzivam a) migruju z Oracle nebo MSSQL a nechci prepisovat aplikaci, b) v nezbytne nutnych pripadech, kdy opravdu chci zmenu kontextu (par funkci, ktere pouzivam pro zabezpeceni). V bezne funkci si nemohu udelat bezpecnostni problem. SECURITY DEFINER funkci mohu, tim menim identitu pod kterou mi bezi kod.

Pavel


Zbynek Vanzura
hep...@gmail.com

--
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny PostgreSQL-cz ve Skupinách Google.
Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, zašlete e-mail na adresu postgresql-c...@googlegroups.com.
Chcete-li zobrazit tuto diskusi na webu, navštivte https://groups.google.com/d/msgid/postgresql-cz/CAEQ2o3%3DMR2gcY2DCWdkxo3FphxJEYrAjAeR8k75%2BF8M%3D%2B72nKg%40mail.gmail.com.

Pavel Stehule

unread,
Jan 15, 2021, 6:48:19 AM1/15/21
to PostgreSQL-cz


pá 15. 1. 2021 v 12:05 odesílatel Pavel Stehule <pavel....@gmail.com> napsal:
jinak, kdyz jsme jeste u vasich benchmarku. Ten vyraz nativne vraci text - ale vy tam vracite varchar - u takto jednoduche funkce implicitni pretypovani dela u mne na 14tce 5%. Ve starsich verzich pg to muze byt vic.

Pavel

Pavel Stehule

unread,
Jan 17, 2021, 1:51:18 PM1/17/21
to PostgreSQL-cz
pá 15. 1. 2021 v 12:05 odesílatel Pavel Stehule <pavel....@gmail.com> napsal:

zrovna nedavno se aktualizovala stranka na pg wiki

Reply all
Reply to author
Forward
0 new messages