You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
NETEZZA<br />
APPLIANCE<br />
Danilo De Benedictis – danilode@gmail.com<br />
NETEZZA SQL – DAY 2
ACCESSO A NETEZZA SQL CON NZSQL<br />
Netezza SQL<br />
SQL 92: standard ANSI/ISO (full compliant)<br />
SQL/CLI: supporto al Client/Server (ODBC, JDBC)<br />
SQL:1999: supporto alle RegExpr, Recurs.Query,<br />
triggers, O.O.<br />
nzsql: Usato per lanciare comandi ‘Netezza<br />
SQL’ verso il database<br />
nzsql: lanciato da shell LINUX.<br />
Multiple Connection / Single SQL Activity per<br />
Connection.<br />
nzsql :TERMINARE CON ‘;’ IL COMANDO....<br />
\q per uscire dal prompt
ACCESSO A NETEZZA SQL CON NZSQL<br />
Log On:<br />
nzsql -d DB_VENDITE -u danilode -pw<br />
Passw0rd!<br />
oppure<br />
export NZ_USER=danilode<br />
export NZ_PASSWORD= Passw0rd!<br />
export NZ_DATABASE= DB_VENDITE<br />
Nzsql<br />
Per cambiare connessione:<br />
\c[onnect] [dbname [user] [password]]
ACCESSO A NETEZZA SQL CON NZSQL<br />
Nzsql prompt result:<br />
nzsql<br />
CREATE TABLE test1 (col1 INTEGER, col2 INTEGER, col3 CHARACTER(40));<br />
CREATE TABLE<br />
INSERT INTO test1 VALUES (100, 200, 'This is a test');<br />
INSERT 0 1 (lo 0 è retaggio storico..)<br />
INSERT INTO test1 VALUES (101, 201, 'Another test');<br />
INSERT 0 1<br />
UPDATE test1 SET col2 = 999 WHERE col1 < 1000;<br />
UPDATE 2<br />
INSERT INTO test1 SELECT * FROM test1;<br />
INSERT 0 2<br />
<strong>del</strong>ete from test1 where col1 > 0;<br />
DELETE 4<br />
TRUNCATE TABLE test1;<br />
TRUNCATE TABLE<br />
DROP TABLE test1;<br />
DROP TABLE
ACCESSO A NETEZZA SQL CON NZSQL<br />
Management <strong>del</strong>le Sessioni:<br />
SHOW SESSION [ ALL | ] [<br />
VERBOSE ]<br />
ALTER SESSION [ ] ROLLBACK<br />
TRANSACTION<br />
ALTER SESSION [] SET PRIORITY<br />
TO <br />
DROP SESSION
ACCESSO A NETEZZA SQL CON NZSQL<br />
Supporto SSL per i Client:<br />
export NZ_SECURITY_LEVEL=level<br />
export NZ_CA_CERT_FILE=pathname
ACCESSO A NETEZZA SQL CON NZSQL<br />
Variabili SQL di Sessione:<br />
DB_VENDITE(danilode)=> \set<br />
VERSION = 'Netezza SQL Version 1.1'<br />
PROMPT1 = '%/%(%n%)%R%# '<br />
PROMPT2 = '%/%(%n%)%R%# '<br />
PROMPT3 = '>> '<br />
HISTSIZE = '500'<br />
DBNAME = DB_VENDITE '<br />
USER = danilode '<br />
HOST = '127.0.0.1'<br />
PORT = '5480'<br />
ENCODING = 'LATIN9'<br />
NZ_ENCODING = 'UTF8'
ACCESSO A NETEZZA SQL CON NZSQL<br />
COMMAND INPUT:<br />
SQL COMMAND DA STRINGA:<br />
nzsql -c "select * from mia_tabella“<br />
SQL COMMAND DA STANDARD INPUT:<br />
nzsql < foo.sql<br />
SQL COMMAND DA FILE<br />
nzsql -f foo.sql
ACCESSO A NETEZZA SQL CON NZSQL<br />
COMMAND OUTPUT:<br />
OUTPUT IN VARIABILE:<br />
VAR1=‘nzsql -A -t -c "select count(*) from<br />
test_table"‘<br />
OUTPUT AD UNA STAMPANTE:<br />
nzsql | lpr<br />
OUTPUT SU UN FILE:<br />
nzsql -o report.out<br />
Successivamente, tutti i comandi lanciati da nzsql vanno<br />
sul file report.out
ACCESSO A NETEZZA SQL CON NZSQL<br />
nzsql COMMAND<br />
OPTIONS:
ACCESSO A NETEZZA SQL CON NZSQL<br />
nzsql COMMAND<br />
OPTIONS:
ACCESSO A NETEZZA SQL CON NZSQL<br />
COMMAND OPTIONS (comments/labels):<br />
-- (doppio ‘meno) : riga di commento<br />
/* */: inizio – fine commento (multiriga)<br />
‘stringa’: gli apici SINGOLI racchiudono le<br />
stringhe<br />
“NOME COLONNA”: i DOPPI apici<br />
racchiudono le labels.<br />
Ultime versioni di Netezza SQL usano upper case:<br />
per usare lower case nelle labels, racchiudere tra<br />
doppi apici (i.e. CREATE TABLE “Employee”)
ACCESSO A NETEZZA SQL CON NZSQL<br />
Backslash<br />
Options:<br />
Dall’interno<br />
di nzsql
ACCESSO A NETEZZA SQL CON NZSQL<br />
Backslash<br />
Options:<br />
Dall’interno<br />
di nzsql
ACCESSO A NETEZZA SQL CON NZSQL<br />
Backslash<br />
Options:<br />
Dall’interno<br />
di nzsql
ACCESSO A NETEZZA SQL CON NZSQL<br />
Query Buffer, per editare comandi SQL più<br />
complessi:<br />
\e lancia un editor esterno per editing <strong>del</strong>la query.<br />
Alla chiusura <strong>del</strong>l’editor, la query viene lanciata.<br />
Editor vi di default:<br />
Per cambiare editor: export EDITOR=emacs<br />
\p contenuto <strong>del</strong> buffer<br />
\r reset <strong>del</strong> buffer (cancellazione)<br />
\w scrive il contenuto <strong>del</strong> buffer su file
ACCESSO A NETEZZA SQL CON NZSQL<br />
Exit Code:<br />
0 : Success<br />
1 : Errore generico (Sintassi, problema sul DB,<br />
etc..)<br />
2 : Errore di connessione (nome DB sbagliato,<br />
username/password sbagliata, etc..)<br />
3 : Query cancellata dall’utente (Control+C)<br />
Eseguendo i comandi via file (-f):<br />
Nzsql continua l’esecuzione anche su errore.<br />
Per fermare l’esecuzione in caso d’errore:<br />
‘-v ON_ERROR_STOP=1’
SCRIPTING<br />
QUERY MULTIPLE IN UNICO FILE:<br />
nzsql < script_file (STD IN da file)<br />
nzsql -f script_file (specifica il file name)<br />
EMP(USER)=> \i script_file (specifica il file name<br />
stando già nell’ambiente interprete di comandi<br />
nzsql).
NETEZZA DATATYPES
NETEZZA DATATYPES<br />
USARE CON CAUTELA: approssimazione nelle<br />
aggregazioni dipendono da ordinamenti interni,<br />
e da parallelismo (unpredictable).<br />
Es. SUM e AVG sono parzialmente computate<br />
dalle SPU (in parallelo), ed aggregate dall’host:<br />
il risutato finale può essere diverso da run a run.
NETEZZA DATATYPES<br />
COMPARE CON NUMBER: usare sempre to_number:<br />
where to_number(, '9999') ><br />
NETEZZA DATATYPES<br />
Valorizzare con:<br />
true / false<br />
on / off<br />
‘0’ / ‘1’<br />
‘true’ / ‘false’<br />
‘t’ / ‘f’<br />
‘on’ / ‘off’<br />
‘yes’ / ‘no’<br />
Non usare mai un<br />
BOOL come<br />
DISTRIBUTION:<br />
I dati verrebbero<br />
distribuiti solo su 2<br />
slices dei dischi.
NETEZZA DATATYPES
NETEZZA DATATYPES<br />
TIME INTERVAL : NON STANDARD<br />
IMPLEMENTATION<br />
Specifica unità di misura: sintassi accettata ma non<br />
usata:<br />
Può contenere intervalli di qualsiasi unità di misura (day,<br />
year, etc.)<br />
Literal: può contenere intervalli <strong>del</strong> tipo «13 years 4<br />
months» per indicare un intervallo di 13 anni e 4 mesi.<br />
Lo standard SQL non consente literals.<br />
Netezza normalizza tutti gli intervalli all’unità di misura<br />
dei secondi.<br />
Netezza considera un mese sempre di 30 gg, per<br />
evitare errori usare sempre intervalli con unit < mese<br />
(es. day).<br />
I TIMEINTERVAL non possono essere applicati alle<br />
external table.
NETEZZA DATATYPES<br />
INTERNAL DATATYPES:<br />
Rowid: identificativo univoco di un record<br />
all’interno <strong>del</strong> database (max = 2^64 / 2)<br />
Netezza assegna un intervallo x ogni SPU<br />
Ad intervallo consumato, Netezza assegna un<br />
altro intervallo libero, ma non necessariamente<br />
contiguo<br />
=> gli intervalli non sono necessariamente sequenziali<br />
nella stessa tabella.
NETEZZA DATATYPES<br />
INTERNAL DATATYPES:<br />
Createxid : tranID che ha creato il record.<br />
Deletexid: tranID che ha cancellato il record.<br />
UPDATE: cancellazione logica = <strong>del</strong>ete+insert:<br />
tranID-><strong>del</strong>etexid (riga cancellata)<br />
tranID->insertxid (nuova riga)<br />
Se possibile, non usare UPDATE (double space)
NETEZZA DATATYPES<br />
INTERNAL DATATYPES:<br />
datasliceID: identificativo univoco <strong>del</strong>la porzione<br />
di disco su cui è memorizzata la riga.<br />
Record datasliceID disco fisico<br />
SELECT DATASLICEID, name FROM mia_tabella;<br />
Restituisce il data slice da cui proviene il record.<br />
[Esempio]
SINTASSI NETEZZA SQL<br />
1. GESTIONE DATABASE<br />
2. ACCESSO AD ALTRI DATABASE<br />
3. GESTIONE TABELLE<br />
4. JOIN TRA TABELLE<br />
5. COMBINE TRA TABELLE<br />
6. GESTIONE VISTE<br />
7. GESTIONE VISTE MATERIALIZZATE<br />
8. SUBQUERY<br />
9. FUNZIONI DI AGGREGAZIONE<br />
10. SCRIPTING
GESTIONE DATABASE<br />
CREATE DATABASE db_name;<br />
DROP DATABASE db_name;<br />
ALTER DATABASE db_name RENAME TO<br />
newdb;<br />
Database MAXIMUM:
GESTIONE DATABASE : CALCOLO ROWSIZE<br />
Disk size di ciascun campo;<br />
3 x 8 byte overhead fisso per ogni riga:<br />
Rowid<br />
Createxid<br />
Deletexid<br />
N: #colonne nullable: (N/8) bytes in header, rounded a 4<br />
bytes (un bit per ogni campo nullable).<br />
4 bytes in header se esiste almeno una colonna di tipo:<br />
VARCHAR<br />
CHAR (len > 16)<br />
NCHAR<br />
NVARCHAR
GESTIONE DATABASE : SQL IDENTIFIERS<br />
Sono i nomi di database, tabelle, campi,<br />
user, gruppi, oggetti definiti da utente.<br />
128 byte lunghezza max<br />
WARNING: password e filename non sono<br />
Identifiers.
GESTIONE DATABASE : SQL IDENTIFIERS<br />
REGULAR IDENTIFIERS: nome di DB object<br />
Non case-sensitive (sempre convertiti UPPER)<br />
Lettere+numeri+ ‘_’ + ‘$’<br />
1° carattere lettera<br />
non usare parole riservate<br />
DELIMITED IDENTIFIER: nome di DB object<br />
Delimitato da doppi apici (es. " DB_Clienti")<br />
Case-sensitive<br />
Può includere anche:<br />
1° carattere qualsiasi<br />
caratteri speciali (es. %, -, spazi)<br />
Parole riservate
ACCESSO AD ALTRI DATABASE<br />
Nelle query, è possibile referenziare oggetti<br />
presenti su diversi database, ma:<br />
Solo oggetti presenti sullo stesso server fisico<br />
Non è possibile nella SELECT per la creazione<br />
di MATERIALIZED VIEW<br />
Nome referenza a 3-livelli:<br />
Db_name.schema_name.object_name<br />
Db_name..object_name (usa default schema)<br />
schema_name.object_name (stesso DB)<br />
Scripting: schema = nome <strong>del</strong> DB Owner
ACCESSO AD ALTRI DATABASE<br />
Esempio:<br />
SELECT COUNT (*)<br />
FROM<br />
DEV..EMP DE ,<br />
PROD..EMP PE<br />
WHERE DE.ID = PE.ID;<br />
Esempio:<br />
CREATE TABLE KEYEMPS AS<br />
SELECT *<br />
FROM<br />
PROD..EMP<br />
INTERSECT<br />
SELECT * FROM DEV..EMP;
ACCESSO AD ALTRI DATABASE<br />
Non è possibile usare cross-database nelle<br />
INSERT, UPDATE, or DELETE.<br />
dev(admin)=>INSERT INTO PROD..EMP<br />
SELECT * FROM EMP;<br />
Error: Cross Database Access not supported for<br />
this type of command.<br />
Usare invece:<br />
prod(admin)=>INSERT INTO EMP SELECT *<br />
FROM DEV..EMP;
ACCESSO AD ALTRI DATABASE<br />
ALIAS<br />
È possibile usare ALIASes per nomi tabella e<br />
nomi colonna<br />
Non sono persistenti (query scope)<br />
Es.<br />
dev(admin)=>FROM emp E WHERE E.id =10<br />
dev(admin)=>FROM admin.emp E WHERE E.id =10
ACCESSO AD ALTRI DATABASE<br />
SYNONYM<br />
È possibile creare Sinonimi per referenziare oggetti sul<br />
DB corrente o su altri DB:<br />
dev(admin)=>CREATE SYNONYM p_emp FOR<br />
prod..emp;<br />
Consentite CREATE, DROP, ALTER(RENAME), GRANT,<br />
REVOKE<br />
ES.:<br />
GRANT [CREATE] SYNONYM TO user_or_group;<br />
GRANT ALTER, DROP ON synonym_name TO<br />
user_or_group;<br />
REVOKE [CREATE] SYNONYM FROM user_or_group;<br />
REVOKE ALTER, DROP ON synonym_name FROM<br />
user_or_group;
GESTIONE TABELLE<br />
CREATE TABLE:<br />
CREATE TABLE weather (<br />
city varchar(80),<br />
temp_lo int, -- low temperature<br />
temp_hi int, -- high temperature<br />
prcp real, -- precipitation<br />
date date<br />
);<br />
Parole riservate:ctid, oid, xmin, cmin, xmax,<br />
cmax, tableoid, rowid, datasliceid, createxid,<br />
and <strong>del</strong>etexid.
GESTIONE TABELLE
GESTIONE TABELLE
GESTIONE TABELLE
GESTIONE TABELLE<br />
«...Note:<br />
The system permits and maintains primary key, default,<br />
foreign key, unique, and references.<br />
The Netezza does not support constraint checks and<br />
referential integrity. The user<br />
must ensure constraint checks and referential integrity.»<br />
Optimizer usa le PK e le FK per il query plan.<br />
Esempio SQL (DBVisualizer)...<br />
http://stackoverflow.com/questions/5649297/how-toovercome-netezzas-lack-of-unique-constraintreferential-integrity-enforc
GESTIONE TABELLE<br />
DISTRIBUTION KEY: ogni tabella può avere 1 sola<br />
Distribution K, composta da 1+ colonne (max 4).<br />
[hash]: specificare i campi<br />
[random]: applica una distribuzione round-robin,<br />
generalmente buona, ma non sempre ottimale.<br />
Void: se non si specificano campi, Netezza sceglie i<br />
campi, nessuna garanzia su quali (variano tra le<br />
versioni).
GESTIONE TABELLE<br />
NETEZZA distribuisce i dati di una tabella in<br />
funzione <strong>del</strong>la DISTRIBUTION key (1..4 campi).<br />
I dati <strong>del</strong>la tabella vengono ‘distribuiti’ sulle SPU<br />
con un algoritmo di distribuzione:<br />
HASH: F(fie1+..+fie4) -> Hash Alg -> #SPU.<br />
«NOME» + «COGNOME» -><br />
«PIPPO» + «PLUTO» -><br />
«Mario» + «Rossi» -><br />
«013214» + «aa65h281»-><br />
HASH<br />
ALGORITH<br />
M<br />
SPU #1<br />
SPU #2<br />
SPU #3<br />
SPU #4<br />
RANDOM: distribuzione casuale (non ottimale)
GESTIONE TABELLE<br />
ERRATA<br />
DISTRIBUTION:<br />
Non scegliere campi con<br />
un dominio di valori<br />
limitato.<br />
Esempio Boolean:<br />
HASH: F(fie1 :<br />
BOOLEAN):<br />
TRUE -><br />
TRUE<br />
-><br />
FALSE -><br />
TRUE<br />
-><br />
HASH<br />
ALGORITH<br />
M<br />
SPU #1<br />
SPU #2<br />
SPU #3<br />
SPU #3
GESTIONE TABELLE<br />
TIPS:<br />
I campi in Distribution key non sono UPDATEable.<br />
Scegliere Distribution Key che garantiscono una<br />
distribuzione paritaria su tutte le SPU.<br />
Scegliere colonne con vincolo UNIQUE e con alta<br />
cardinalità.<br />
Non utilizzare RANDOM per tabelle critical, ma<br />
guidare la scelta.<br />
Specificare sempre la clausola DISTRIBUTE,<br />
anche se si vuole usare il primo campo.<br />
Non distribuire su FLOAT o su BOOLEAN.
GESTIONE TABELLE<br />
TIPS:<br />
Usare il minor numero di campi possibile.<br />
COLLOCATED JOIN:<br />
Le SPU possono funzionare in modalità «shared<br />
nothing».<br />
se 2 tabelle vanno spesso in join sullo stesso campo,<br />
usarlo come DISTRIB K. Es:<br />
In un sistema di gestione Ordini, usare come Distrib K il<br />
Customer_id sia sulla tabella CUSTOMER che sulla ORDER.<br />
in questo modo, le SPU raggiungono il massimo livello<br />
di parallelismo, in quanto non devono condividere /<br />
trasmettersi nulla.
GESTIONE TABELLE<br />
TIPS:<br />
Se non è possibile usare le COLLOCATED JOIN, i dati<br />
vengono dinamicamente redistribuiti, o inviati in<br />
broadcast.<br />
DYNAMIC REDISTRIBUTION<br />
Ciascuna SPU<br />
Estrae solo le righe richieste<br />
estrae solo le colonne richieste<br />
Calcola la SPU di competenza per eseguire la join<br />
Invia i dati direttamente alla SPU destinataria<br />
DYNAMIC BROADCAST<br />
Ciascuna SPU<br />
Estrae tutte le righe <strong>del</strong>la tabella<br />
estrae tutte le colonne <strong>del</strong>la tabella<br />
Invia i dati in broadcast a tutte le SPU
GESTIONE TABELLE<br />
CHECK TABLE DISTRIBUTION:<br />
SELECT datasliceid, COUNT(*)<br />
FROM <br />
GROUP BY datasliceid;<br />
4 Rows Returned (normally one per SPU)<br />
<br />
DATASLICEID COUNT<br />
1 7<br />
2 7<br />
3 7<br />
4 7<br />
In questo caso: distribuzione ottimale.<br />
WARNING: le colonne di distribuzione non<br />
possono essere updated.
GESTIONE TABELLE<br />
CHECK<br />
RECORD<br />
DISTRIBUTI<br />
ON<br />
evitare il<br />
DATA<br />
SKEW<br />
(check con<br />
NZADMIN<br />
tool).
GESTIONE TABELLE<br />
DATA SKEW (check con NZADMIN tool)<br />
Differenza in Mb tra l’allocazione di<br />
max data-slice di una tabella (Mb contenuti nel dataslice<br />
che contiene maggior porzione dati <strong>del</strong>la tabella)<br />
min data-slice di una tabella (Mb contenuti nel data-slice<br />
che contiene minor porzione dati <strong>del</strong>la tabella)