NETEZZA APPLIANCE - di.univaq.it DEVELOPMENT STORED PROCEDURES. STORED PROCEDURES Definizione: Le Stored Procedure sono la ... RETURN select length ...

Post on 23-Mar-2018

222 Views

Category:

Documents

3 Downloads

Preview:

Click to see full reader

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