PL/pgSQL je jednoduchý interpret Každý výraz se převádí

Transkript

PL/pgSQL je jednoduchý interpret Každý výraz se převádí
●
PL/pgSQL je jednoduchý interpret
●
Každý výraz se převádí na SQL příkaz
●
Každý SQL příkaz má svůj vlastní prováděcí plán
●
Výsledek každého dotazu je transformován
ČÍM MÉNĚ KÓDU TÍM LÉPE
OVŠEM POZOR NA ČITELNOST
IF jmeno IS NOT NULL THEN
s := jmeno;
END IF;
IF prijmeni IS NOT NULL THEN
IF s IS NOT NULL THEN
s := s || ' ';
END IF;
s := s || prijmeni;
END IF;
74 ms
Přepis do SQL funkce: 20 ms
144 ms
s := COALESCE(jmeno || ' ' || prijmeno, jmeno);
CREATE OR REPLACE FUNCTION public.f1(text, text)
RETURNS text
LANGUAGE plpgsql
AS $function$#option dump
declare s text;
begin
if $1 is not null then
s := $1;
end if;
if $2 is not null then
if s is not null then
s := s || ' ';
end if;
s := s || $2;
end if;
return s;
end;
$function$
Function's data area:
entry 0: VAR $1
entry 1: VAR $2
entry 2: VAR found
entry 3: VAR s
type text (typoid 25) atttypmod -1
type text (typoid 25) atttypmod -1
type bool (typoid 16) atttypmod -1
type text (typoid 25) atttypmod -1
Function's statements:
3:BLOCK <<*unnamed*>>
4: IF 'SELECT $1 is not null' THEN
5: ASSIGN var 3 := 'SELECT $1'
ENDIF
7: IF 'SELECT $2 is not null' THEN
8: IF 'SELECT s is not null' THEN
9:
ASSIGN var 3 := 'SELECT s || ' ''
ENDIF
11: ASSIGN var 3 := 'SELECT s || $2'
ENDIF
13: RETURN 'SELECT s'
END -- *unnamed*
CREATE OR REPLACE FUNCTION public.f2(text, text)
RETURNS text
LANGUAGE plpgsql
AS $function$#option dump
begin
return coalesce($1 || ' ' || $2, $1);
end;
$function$
Function's data area:
entry 0: VAR $1
entry 1: VAR $2
entry 2: VAR found
type text (typoid 25) atttypmod -1
type text (typoid 25) atttypmod -1
type bool (typoid 16) atttypmod -1
Function's statements:
2:BLOCK <<*unnamed*>>
3: RETURN 'SELECT coalesce($1 || ' ' || $2, $1)'
END -- *unnamed*
●
●
Uložené procedury snižují množství
●
komunikace po síti
●
interproces komunikace
I špatně napsaná procedura může rychlejší
nežli kód na straně klienta.
●
Dobře napsaný kód v PL může být řádově
rychlejší nežli kód na straně klienta.
1
2
3
4
5
6
7
8
9
10
11
CREATE OR REPLACE FUNCTION public.f(a integer)
RETURNS integer
LANGUAGE plpgsql
AS $function$
#option dump
DECLARE s int := 0; r record;
BEGIN
FOR r IN SELECT * FROM foo WHERE foo.a = f.a
LOOP
s := s + r.a;
END LOOP;
RETURN s;
END;
$function$
Function's data area:
entry 0: VAR $1
type int4 (typoid 23) atttypmod -1
entry 1: VAR found
type bool (typoid 16) atttypmod -1
entry 2: VAR s
type int4 (typoid 23) atttypmod -1
DEFAULT 'SELECT 0'
entry 3: REC r
entry 4: RECFIELD a
of REC 3
Function's statements:
4:BLOCK <<*unnamed*>>
5: FORS r 'SELECT * FROM foo WHERE foo.a = f.a'
7: ASSIGN var 2 := 'SELECT s + r.a'
ENDFORS
9: RETURN 'SELECT s'
END -- *unnamed*
Vyhodnoť
Vyhodnoť
výraz
výraz
ANO
Existuje
Existuje
prováděcí
prováděcí
plán?
plán?
NE
Generuj
Generuj
prováděcí
prováděcí
plán
plán
Zjisti,
Zjisti,zda
zdase
se
jedná
o
jednoduchý
jedná o jednoduchý
plán
plán- -výraz
výraz
Vykonej
Vykonej
prováděcí
prováděcí
plán
plán
Uložené
Uloženéprováděcí
prováděcíplány
plányse
se
po
ukončení
session
zahodí
po ukončení session zahodí
●
Nevhodný přístup
●
PL/pgSQL není Fortran – vše co nemusíme
programovat, nesmíme programovat.
●
Psaní jednořádkových funkcí v PL/pgSQL.
●
Optimalizace naslepo nezafunguje – občas je
nutné použít dynamické SQL.
●
Paměťová náročnost – sčítání řetězců, úpravy polí
●
Opakování deTOAST procesu.
●
Opakované transformace hodnot při neshodě typů.
SELECT * FROM tab
WHERE jmeno = 'Tonda';
DECLARE r RECORD;
BEGIN
FOR r IN SELECT * FROM tab
WHERE jmeno = $1
LOOP
...
END LOOP;
DECLARE r RECORD;
BEGIN
FOR r IN
EXECUTE 'SELECT * FROM tab WHERE jmeno = $1'
USING $1
LOOP
...
END LOOP
DECLARE a int[] := '{}'
BEGIN
FOR i IN 1..100
LOOP
a[i] := 0;
END LOOP;
DECLARE a int[] = array_fill(0, ARRAY[100]);
BEGIN
...
DECLARE
_a int[];
s bigint = 0;
BEGIN
_a := (SELECT a FROM tab WHERE ... )
FOR i IN array_lower(a,1) .. array_upper(a,1)
LOOP
s := s + _a[i];
END LOOP;
-- workaround
DECLARE
_a int[]; _b int[];
BEGIN
_a := (...);
_b := _a;
/* provede deTOAST _a */
DECLARE
a float;
b numeric;
BEGIN
FOR ...
LOOP
b := sin(x);
/* neefektivní */
b := sin(x)::numeric; /* efektivní */
V případě neshody typu používá
PLpgSQL relativně náročnou IO
transformaci

Podobné dokumenty

9. Datové typy v MySQL, typy tabulek, funkce v MySQL

9. Datové typy v MySQL, typy tabulek, funkce v MySQL - nelze používat ORDER BY a AUTO_INCREMENT - nepodporují sloupce BLOB a TEXT tabulky InnoDB - jsou transakčně bezpečným typem tabulek (lze použít COMMIT a ROLLBACK) - chceme-li používat tabulky Inn...

Více

PostgreSQL ve verzi 9.2, 9.3 a 9.4 SQL

PostgreSQL ve verzi 9.2, 9.3 a 9.4 SQL Poddotaz se může objevit i v klauzuli FROM – pak jej označujeme jako derivovaná tabulka 14. I derivovanou tabulku lze spojovat s běžnými tabulkami (obojí je relací). Následující příklad zobrazí sez...

Více

collate "cs_CZ"

collate "cs_CZ" parametry funkce CREATE FUNCTION foo(a int = 3, b int = 0) RETURNS ... SELECT foo(); SELECT foo(10,20); SELECT foo(10, b := 30); SELECT foo(10); SELECT foo(b := -1, a := 20);

Více

PostgreSQL 8.2 efektivne

PostgreSQL 8.2 efektivne Pro opakované importy se vyplatı́ použı́t jednoduchou funkci v untrusted PLperlu a v této funkci se připojit ke zdrojové databázi, zı́skat data a ta vrátit jako výsledek funkce. Odpadajı́ t...

Více

Instalujeme PostgreSQL

Instalujeme PostgreSQL Operační systém Linux je velmi často používán jako router, firewall nebo webový či aplikační server. Záměrně jsem zde nezmínil možnost nasazení Linuxu jako databázového serveru, protože právě tomut...

Více

Školení PostgreSQL efektivne - Všeobecná cást + administrace

Školení PostgreSQL efektivne - Všeobecná cást + administrace V přı́padě výpadku lze databázi obnovit z transakčnı́ho logu, tj. je zajištěna konzistence datových souborů a indexů. Při potvrzenı́ transakce je nutné provést operaci fsync pouze na t...

Více

Luděk Skočovský COMPUTER SCIENCE ENJOYER

Luděk Skočovský COMPUTER SCIENCE ENJOYER Postupné zmenšování záznamové jednotky je dokáže zhustit na stále menší plochu a  umožňuje snižovat čas potřebný k  jejich čtení. Ale ne již lidskými smysly. Přestože toto neustálé hledání (a  nalé...

Více

PostgreSQL 9.1 efektivne

PostgreSQL 9.1 efektivne Návrh vlastnı́ch funkcı́ C, PL/pgSQL, PL/SQL, PL/Perl, PL/Python, PL/Java, PL/Php, PL/R Podpora OUT parametrů Podpora Set Returning Functions (výsledkem je tabulka) Podpora ošetřenı́ chyb Podp...

Více

výměna vstřikovacího čerpadla - caps cnh

výměna vstřikovacího čerpadla - caps cnh Před demontáží vstřikovacího čerpadla CAPS z motoru proveď následující úkony popsané níže. Toto je velice důležité z důvodu správné diagnostiky a vyloučení pochybení při výměně vstřikovacího čerpad...

Více