User Tools

Site Tools


wiki:postgres:pg_tune_kurs_procedures

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

wiki:postgres:pg_tune_kurs_procedures [2017/09/28 12:21] (current)
Line 1: Line 1:
 +====== Procedures ======
 +Für eine Procedure benötigt man einen **Editor** und eine **Programmiersprache**(language).\\
  
 +  CREATE OR REPLACE FUNCTION mysum(int,​int)
 +         ​RETURNS int4 AS '​SELECT $1 + $2'
 +         ​LANGUAGE '​sql';​
 +
 +  * Prinzip der Funktionsüberladung,​ d.h. (int,int) ist nicht die gleiche Funktion wie (text,text)
 +  * '​SELECT $1 + $2' ist einfach nur ein String (die Verarbeitung des Strings ist Sache der Programmiersprache die aufgerufen wird.
 +
 +  test=# \h CREATE LANGUAGE
 +    CREATE [ OR REPLACE ] [ PROCEDURAL ] LANGUAGE name
 +    CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGE name
 +        HANDLER call_handler [ INLINE inline_handler ] [ VALIDATOR valfunction ]
 +  /* call_handler -> vermittelt zwischen der Datenbank und der externen Programmiersprache
 +     ​VALIDATOR ​   -> optional, wird bei CREATE oder REPLACE aufgerufen (prüft auf Syntaxfehler)
 +
 +===== Programmiersprachen(languages) =====
 +==== on board ====
 +on-board bedeutet das call_handler etc. on-board ist, die Sprache selbst ist immer extern. on-board sind natürlich nur jene, die bei //​./​configure//​ berücksichtigt wurden.\\
 +
 +  * C/C++  ... hier steht im String nicht der Code sondern der Funktionsname
 +  * SQL
 +  * PL/pgSQL
 +  * PL/Perl
 +  * PL/Python
 +  * PL/TCL
 +\\
 +
 +  * pg_config ​ UNIX shell :?:​on-board:?:​
 +
 +==== Nicht an Bord ====
 +
 +  * PL/sh
 +  * PL/R
 +  * Es gibt sogar PL/​Javascript und 100te andere.
 +
 +=== R ===
 +Von CRAN kann man sich 1000e Module dazuladen (z.b. fast nearest neibourgh search Algorithmus etc...)
 +
 +===== trusted/​untrusted =====
 +sh. **Schulungsunterlagen S.237.**
 +
 +  * language = **trusted:​** ​  ​Systemcalls sind nicht erlaubt
 +  * language = **untrusted:​** darf alles (z.B. mit language perl**u** kann man auf das Filesystem zugreifen)
 +
 +===== Stringbegrenzung =====
 +  '​irgendein Programmtext'​
 +  $$irgendein '​Programmtext mit blöden Hochkommas'​$$
 +  $$_$$irgendein versyntaxter $$Perl $$schas$$_$
 +  $$__aa__$$Das schafft nicht einmal $$_$$Perl$$_$$$$__aa__$$
 +  ​
 +===== CREATE FUNCTION =====
 +  test=# \h CREATE FUNCTION
 +  ...
 +   | IMMUTABLE | STABLE | VOLATILE
 +   | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
 +  ...
 +==== VOLATILE ====
 +z.B.: random(); kann nicht indiziert werden, weil sich random() dauernd ändert (so soll es ja auch sein).
 +==== STABLE ====
 +  SELECT now() now(); # innerhalb der Transaktion bleibt now() gleich und kann daher indiziert werden.
 +==== IMMUTABLE ====
 +Hans:"​gottgegeben."​\\
 +  pi(), cos(17),...
 +  aber auch z.B. Polygone
 +
 +**Es ist sehr wichtig, daß man die Funktionen auf der richtigen Ebene (immutable, ...) definiert, sonst kann sie der Optimizer nicht aufrufen. Umso höher markiert wird, umso besser, weil dadurch weniger Funktionsaufrufe notwendig sind! Wird dennoch oft vergessen (Faulheit?​).**
 +
 +==== SECURITY INVOKER | DEFINER ====
 +=== DEFINER ===
 +Funktion wird mit den Rechten dessen aufgerufen, der die Funktion geschrieben hat. D.h. ein //user// kann damit z.b. **auf Daten zugreifen ohne auf die Tabelle Leseberechtigungen** zu haben. Um dann z.b. nach 50 Zugriffen pro Tag Zahlemann aufgedrückt bekommt,...
 +=== INVOKER ===
 +Funktion läuft mit den Berechtigungen des Ausführenden.
 +
 +
 +===== CREATE AGGREGATE =====
 +  \h CREATE AGGREGATE
 +  CREATE AGGREGATE name ( input_data_type [ , ... ] ) (
 +      SFUNC = sfunc,
 +      STYPE = state_data_type
 +      [ , FINALFUNC = ffunc ]
 +      [ , INITCOND = initial_condition ]
 +      [ , SORTOP = sort_operator ]            # Daten in bestimmter Sortierreihenfolge (<,>) um z.B. Trend zu rechnen
 +  )
 +
 +
 +  CREATE AGGREGATE xsum(int) (SFUNC=mysum,​ STYPE=4, INITCOND=0);​
 +  SELECT xsum(id) FROM generate_series(1,​10) AS id
 +   (0,1)
 +   (1,2)
 +   (3,3)
 +   (6,4)
 +    ...
 +   ​(45,​10) = 55 = Ergebnis (vergleiche Gauss von 1 bis 100 zusammenzählen)
 +
 +AGGREGATE kann z.B. für Zinsberechnungen,​ Fahrtstrecken,​ Taxi (einsteigen = 2€, jeder weitere Kilometer 1€) etc. verwendet werden.
 +
 +===== CREATE OPERATOR =====
 +  \h CREATE OPERATOR
 +  CREATE OPERATOR name (
 +      PROCEDURE = function_name
 +      [, LEFTARG = left_type ] [, RIGHTARG = right_type ]
 +      [, COMMUTATOR = com_op ] [, NEGATOR = neg_op ]
 +      [, RESTRICT = res_proc ] [, JOIN = join_proc ]
 +      [, HASHES ] [, MERGES ]
 +  )
 +  ​
 +  test=# CREATE OPERATOR ## (procedure = mysum, leftarg = int4, rightarg = int4);
 +  test=# SELECT 10####20;
wiki/postgres/pg_tune_kurs_procedures.txt · Last modified: 2017/09/28 12:21 (external edit)