netezza appliance - di.univaq.it development stored procedures. stored procedures definizione: le...
Post on 23-Mar-2018
222 Views
Preview:
TRANSCRIPT
NETEZZA
APPLIANCEDanilo De Benedictis – danilode@gmail.com
NETEZZA
DEVELOPMENT
NETEZZA DEVELOPMENT
STORED PROCEDURES
ANALYTIC FUNCTIONS
NETEZZA DEVELOPMENT
STORED PROCEDURES
STORED PROCEDURES
Definizione: Le Stored Procedure sono la
combinazione di SQL + linguaggio
procedurale:
Branch
Loop
Subprogram
NZPLSQL: linguaggio (interpretato) di
programmazione per le stored procedures di
Netezza
Basato sul precedente Postgres PL/pgSQL
STORED PROCEDURES
NZPLSQL: CARATTERISTICHE
Condizioni (IF/ELSE)
Loop (WHILE/FOR)
SQL e dynamic SQL
Variabili
Return:Scalar
Result Set
Argomenti in input
Esecuzione nel contesto chiamanteSession
Transaction
NZPLSQL: SINTASSI
CREATE OR REPLACE PROCEDURE
sp_nome(varchar(6))
RETURNS INT4 LANGUAGE NZPLSQL AS
BEGIN_PROC
DECLARE str varchar;
BEGIN
str := $1;
END;
RETURN select length(str);
END_PROC;
STORED PROCEDURES
STORED PROCEDURE : PARAMETRI INPUT
I Parametri input alla SP vengono righiamati
come $1, $2, etc., da 0 a 64 parametric.
VARARGS: specifica una LISTA DI
PARAMETRI (max 64)
Netezza salva nell’array
PROC_ARGUMENT_TYPES i datatypes (in
format OID) dei parametri input.
STORED PROCEDURES CREATE OR REPLACE PROCEDURE sp_varargs01(varargs)
RETURNS INT4
LANGUAGE NZPLSQL
AS
BEGIN_PROC
DECLARE
num_args int4;
typ oid;
idx int4;
BEGIN
num_args := PROC_ARGUMENT_TYPES.count;
RAISE NOTICE 'Number of arguments is %', num_args;
for i IN 0 .. PROC_ARGUMENT_TYPES.count - 1 LOOP
typ := PROC_ARGUMENT_TYPES(i);
idx := i+1;
RAISE NOTICE 'argument $% is type % value ''%''', idx, typ,
$idx;
END LOOP;
END;
END_PROC;
STORED PROCEDURES
Demo PROC_ARGUMENT_TYPES
Per convertire il datatype nel nome del datatype:
SELECT DISTINCT FORMAT_TYPE, ATTTYPID
FROM _V_RELATION_COLUMN;
MYDB(USER)=> CALL updateacct();
MYDB(USER)=> EXEC updateacct();
MYDB(USER)=> EXECUTE updateacct();
MYDB(USER)=> EXECUTE PROCEDURE
updateacct();
MYDB(USER)=> SELECT updateacct();
MYDB(ADMIN)=> EXEC
OTHERDB..UPDATEACCT();
STORED PROCEDURES
STORED PROCEDURES
NZPLSQL supporta gli array.
Per dichiarare un array: name VARRAY(size) OF type;
Tutti gli elementi dell’array inizialmente contengono ilvalore SQL NULL.
Per assegnare un valore: name(idx) := value;
Supportati: name.EXTEND(size)
name.COUNT
name.TRIM(size)
LOOP
Query Processing in Loops FOR rec in SELECT * from mytable LOOP
IF rec.type = ‘d’ THEN
EXECUTE IMMEDIATE ‘DELETE FROM mytable2 WHERE
recid = ‘ || rec.id;
END IF;
END LOOP;
LOOP
Query Processing in Loops
La outer SELECT viene eseguita, ed il risultato
messo in CACHE.
La inner DELETE viene eseguita solo
successivamente, quindi non impatta il risultato della
DELETE.
La precedente query non è ottimale. Rewrite: DELETE from mytable2
where recid in
(select recid from my table
where type = 'd') ;
NETEZZA DEVELOPMENT
ANALYTIC FUNCTIONS
ANALYTIC FUNCTION
Definizione: Le Funzioni Analitiche calcolano un valore aggregato (per ogni riga) basato su un gruppo di righe, definite da una finestra.
La dimensione della finestra è data da un numero o da un intervallo logico.
Funzioni Analitiche VS Funzioni Aggregate
Le Funzioni Analitiche restituiscono 1 valore per ogni riga dell’insieme di aggregazione.
Le Funzioni Aggregate (...count(*) ... Group by...) restituiscono 1 valore per ogni insieme di aggregazione.
FUNZIONI DI AGGREGAZIONE
AGGREGAZIONE DI GRUPPO:
restituiscono il risultato calcolato su 0-n
righe.
SELECT max(temp_lo) FROM weather;
Es. MAX, MIN
Usate anche con GROUP BY
Usate anche con GROUP BY .. HAVING ..
FUNZIONI DI AGGREGAZIONE
AGGREGAZIONE SU FINESTRA (i.e.
WINDOWS ANALYTIC FUNCTIONS)
restituiscono il risultato calcolato su UN
GRUPPO DI 0-n righe DEFINITE DA UNA
FINESTRA.
ESEMPIO: data la tabella...
FUNZIONI DI AGGREGAZIONE
AGGREGAZIONE SU FINESTRA:
Esempio 1:
SELECT year,
month,
salesk,
avg(salesk) OVER (PARTITION BY year ORDER BY month ROWS BETWEEN 1
PRECEDING AND 1 FOLLOWING)
FROM monthlysales;
Ogni riga, utilizza la precedente (se esiste) e la successiva (se esiste) in una finestra con ordinamento desiderato, per fare un calcolo aggregato.
FUNZIONI DI AGGREGAZIONE
AGGREGAZIONE SU FINESTRA: risultato 1:
AVG(20,22,25) = (20+22+25)/3 = 67/3 = 22.33333
AVG(22,25,30) = (22+25+30)/3 = 77/3 =25.66666 Dov’è l’errore ???
FUNZIONI DI AGGREGAZIONE
AGGREGAZIONE SU FINESTRA:
Esempio 2:
SELECT *,
sum(salesk)OVER (PARTITION BY year ORDER BY
month ROWS UNBOUNDED PRECEDING)
FROM monthlysales;
Ogni riga, utilizza tutte le precedenti della PARTITION.
FUNZIONI DI AGGREGAZIONE
AGGREGAZIONE SU FINESTRA: risultato
2:
SUM(30,35,50) = 115
ANALYTIC FUNCTION
Benefici
Ottimizzazione query processing
Spesso le funzioni analitiche si traducono in algoritmi
con complessità lineare, rispetto a soluzioni
equivalenti (nel risultato) con complessità di ordine
superiore.
Codice maggiormente leggibile
In una singola riga si trova la codifica di interi
statement composti da query e subquery
Codice più facile da manutenere
La leggibilità del codice si traduce in una facilità di
manutenzione
ANALYTIC FUNCTION
Classificazione in Famiglie.
Window Aggregate: utilizzo dei valori delle singole righe della partizione (=window=cluster) unitamente al valore aggregato: avg, sum, min, max, count, variance, stddev, ...
Lag/Lead: singole righe della partizione (=window=cluster) aventi un offset tra loro: lag, led, ...
First/Last: primo ed ultimo valore della partizione (=window=cluster) di righe: first_value, last_value
Ranking: classificazione delle righe, all’interno della partizione (=window=cluster): ntile, dense_rank, percent_rank, cume_dist, rank
ANALYTIC FUNCTION
Classificazione in Famiglie.
Row Count: progressivo di riga all’interno della
partizione.
Hypotetical Set: funzioni che indicano il rank
percentile che una riga avrebbe se fosse inserita
in una partizione:
dense_rank, percent_rank, cume_dist, rank
Inverse Distribution: restituiscono il valore di riga,
all’interno di una partizione, che ha un
determinato percentile:
percentile_cont and, percentile_disc
ANALYTIC FUNCTION
PROCESSING ORDER:
1. Query JOINS, WHERE, GROUP BY, HAVING
2. Analytic Function: calcolo delle funzioni
analitiche all’interno della finestra definita
3. ORDER BY
ANALYTIC FUNCTION
WINDOW PARTITIONING:
tutte le righe che hanno uguali caratteristiche
compongono la finestra di partizione
Nessuna specifica = intero row set restituito dalla
query
WINDOW ORDERING:
Ordinamento all’interno della partizione.
WINDOW FRAMING:
Intervallo, all’interno della Window Partition, per
cui eseguire un calcolo
ANALYTIC FUNCTION
ALL Specifica di agire su tutti i valori (default, quindi non specificare)
ASC | DESC Sequenza di ordinamento
BETWEEN … AND Intervallo della finestra, qualora definiti esplicitamente
CURRENT ROW Si riferisce alla riga corrente
DISTINCT Aggregazione per valori unici. Non supportata da tutte le Function.
EXCLUDE CURRENT ROW Esclude la riga corrente.
EXCLUDE GROUP Esclude un intero gruppo di righe che soddisfano una condizione.
EXCLUDE NO OTHERS Specifica di non escludere alcuna riga (default).
EXCLUDE TIES Specifica di escludere tutte le altre righe collegate alla riga corrente, tranne
la riga corrente.
ANALYTIC FUNCTION
NULLS {FIRST | LAST} Indica come trattate il NULL negli ordinamenti (default FIRST).
ORDER BY Indica come ordinare le righe nell’ambito della partizione (anche su campi
multipli).
OVER Indica che la funzione opera su un risultato di righe calcolate dopo FROM,
WHERE, HAVING clause. E’ usato per definire la finestra di righe a cui applicare la Function
PARTITION BY Definisce la partizione (default = all rows)
ROWS | RANGE Definisce la porzione della partizione su cui calcolare la funzione
(ROWS = righe fisiche / RANGE = intervallo logico )
UNBOUNDED FOLLOWING Specifica che la finestra si estende anche dopo l’ultima riga della partizione.
UNBOUNDED PRECEDING Specifica che la finestra si estende anche precedentemente la prima riga
della partizione.
ANALYTIC FUNCTION
DEFINIZIONE:
FUNZIONE(C) OVER PARTITION (FRAME)
La funzione da applicare al FRAME della
PARTITION può essere:
AVG(C): media sul campo C della finestra definita
nella partizione.
COUNT(C / *):
C = #valori NOT NULL del campo C sulla finestra definita
nella partizione.
* = #righe contenute nella finestra definita nella partizione.
SUM(C): somma sul campo C della finestra definita
nella partizione.
ANALYTIC FUNCTION
DEFINIZIONE:
FUNZIONE(C) OVER PARTITION (FRAME)
La funzione da applicare al FRAME della
PARTITION può essere:
MAX(C): massimo valore del campo C nella finestra
definita nella partizione.
MIN(C): minimo valore del campo C nella finestra
definita nella partizione.
ANALYTIC FUNCTION
DEFINIZIONE:
FUNZIONE(C) OVER PARTITION (FRAME)
La funzione da applicare al FRAME della
PARTITION può essere:
VAR_SAMP(C): varianza dei campioni, esclusi i NULL:
= sum (expr**2) - ((sum (expr) **2) / (count (*)))) / (count (*)- 1)
VARIANCE(C):
0 per 1 riga
VAR_SAMP(C) per N righe
STDDEV_SAMP(C): calcola la deviazione standard di C
= sqr_root(VAR_SAMP(C))
ANALYTIC FUNCTION
DEFINIZIONE:
FUNZIONE(C) OVER PARTITION (FRAME)
La funzione da applicare al FRAME della
PARTITION può essere:
VAR_POP(C): varianza della popolazione di C dopo
aver scartato i NULL
= ( sum(C^2) - sum(C)2 / count(C)) / count(C)
STDDEV_POP(C): deviazione standard della
popolazione di C.
= sqr_root(VAR_POP)
STD_DEV(C): deviazione standard di C
= sqr_root(VARIANCE)
ANALYTIC FUNCTION
LAG / LEAD
LAG N: accesso alla riga precedente nella
finestra con un offset N dalla current row
LEAD N: accesso alla riga successiva nella
finestra con un offset N dalla current row
Se N è fuori range
Default (se specificato)
NULL (se default non specificato)
ANALYTIC FUNCTION
FIRST / LAST
FIRST N: accesso alla prima riga della finestra
LAST N: accesso all’ultima riga della finestra
Se il FIRST / LAST value è NULL
se usato IGNORE NULLS -> primo valore NOT NULL
nella finestra
else NULL
ANALYTIC FUNCTION
RANKING RANK(C): classifica il valore del campo sulla finestra ordinata.
Se N righe hanno pari valore, il rank R tra loro è uguale, ma il rank successivo è R+N.
DENSE_RANK(C): classifica il valore del campo sulla finestra ordinata, con valori interi consecutivi. Se N righe hanno pari valore, il rank R tra loro è uguale, ed il rank
successivo è R+1.
PERCENT_RANK(C): calcola il valore percentuale del rank nella finestra. (RANK(C) – 1) / (#righe nella partizione -1)
0 se la partizione ha 1 riga
CUME_DIST: distribuzione cumulativa. # righe precedenti / # righe della partizione
se esistono pari, vengono contati come 1
NTILE(K): divide l’insieme delle righe nella finestra in K sottoinsiemi numerati da 1 a K, ciascuno con lo stesso numero di righe (+/- 1). La funzione restituisce il # del sottoinsieme a cui è assegnata la riga.
RANK SAMPLE
RANK() OVER (PARTITION BY CITY
ORDER BY amt DESC) AS ranking
RANK() OVER
(PARTITION BY region
ORDER BY SUM(amt)
) as rnk
DENSE_RANK SAMPLE
DENSE_RANK() OVER
(PARTITION BY CITY
ORDER BY amt DESC) AS
ranking
ANALYTIC FUNCTION
HYPOTETICAL RANK(K): calcola il Rank di un ipotetico valore K
sulla finestra ordinata.Se N righe hanno pari valore, il rank R tra loro è uguale,
ma il rank successivo è R+N.
DENSE_RANK(K): calcola il dense_rank di un ipotetico valore K sulla finestra ordinata, con valori interi consecutivi.Se N righe hanno pari valore, il rank R tra loro è uguale, ed
il rank successivo è R+1.
PERCENT_RANK(K): calcola il percent_rank di un ipotetico valore K sulla finestra ordinata. Il risultato è calcolato come se l’ipotetico valore facesse parte della finestra.
CUME_DIST(K): calcola la cume_dist di una ipotetica riga aggiunta alla finestra ordinata.
ANALYTIC FUNCTION
ISTOGRAMMI
width_bucket(<espressione>,<inizio_range>,
<fine_range>, <num_intervalli>)
Restituisce l’intervallo (tra quelli definiti) a cui
l’espressione appartiene.
Else: underflow ; num_intervalli + 1
Esempio: width_bucket(profit_margin, 15,21, 3)
ANALYTIC FUNCTION
AVG OVER PARTITION:
SELECT *
,avg(profit_margin)
over (partition by
region order by city, quarter
rows between 1 preceding and
1 following)
FROMZDDB_SALES_TBL
order by 3,2,1,4
ANALYTIC FUNCTION
SELECT *
, lag(quarter,2) over (partition by region order by city, quarter)
, lead(quarter,2) over (partition by region order by city, quarter)
, first_value(amt) over (partition by city order by quarter)
, last_value(amt) over (partition by city ) /*order by quarter)*/
FROM ZDDB_SALES_TBL
order by 3,2,1,4
top related