NETEZZA APPLIANCE Danilo 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 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: name VARRAY(size) OF type; Tutti gli elementi dell array inizialmente contengono il valore 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 OVER Indica come ordinare le righe nell ambito della partizione (anche su campi multipli). 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) 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