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.