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í 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
- 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...
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...
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);
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...
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...
Š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...
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é...
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ý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...