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