NETEZZA DEVELOPMENT

Transcript

NETEZZA DEVELOPMENT
NETEZZA
APPLIANCE
Danilo De Benedictis – [email protected]
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 chiamante
 Session
 Transaction
STORED PROCEDURES

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 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;
STORED PROCEDURES
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


NZPLSQL supporta gli array.
Per dichiarare un array:



Tutti gli elementi dell’array inizialmente contengono il
valore SQL NULL.
Per assegnare un valore:


name VARRAY(size) OF type;
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
 La
più facile da manutenere
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,

Lag/Lead: singole righe della partizione
(=window=cluster) aventi un offset tra loro:
 lag,

sum, min, max, count, variance, stddev, ...
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.
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:
 Row
 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.
2.
3.
Query JOINS, WHERE, GROUP BY, HAVING
Analytic Function: calcolo delle funzioni
analitiche all’interno della finestra definita
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


ASC | DESC


Esclude un intero gruppo di righe che soddisfano una condizione.
EXCLUDE NO OTHERS


Esclude la riga corrente.
EXCLUDE GROUP


Aggregazione per valori unici. Non supportata da tutte le Function.
EXCLUDE CURRENT ROW


Si riferisce alla riga corrente
DISTINCT


Intervallo della finestra, qualora definiti esplicitamente
CURRENT ROW


Sequenza di ordinamento
BETWEEN … AND


Specifica di agire su tutti i valori (default, quindi non specificare)
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}


ORDER BY


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


Indica come ordinare le righe nell’ambito della partizione (anche su campi
multipli).
OVER


Indica come trattate il NULL negli ordinamenti (default FIRST).
Definisce la partizione (default = all rows)
ROWS | RANGE

Definisce la porzione della partizione su cui calcolare la funzione


UNBOUNDED FOLLOWING


(ROWS = righe fisiche / RANGE = intervallo logico )
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.


DENSE_RANK(C): classifica il valore del campo sulla finestra
ordinata, con valori interi consecutivi.



(RANK(C) – 1) / (#righe nella partizione -1)
0 se la partizione ha 1 riga
CUME_DIST: distribuzione cumulativa.



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.


Se N righe hanno pari valore, il rank R tra loro è uguale, ma il rank
successivo è R+N.
# 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)



FROM
ZDDB_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_TB
L
order by 3,2,1,4