31.05.2013 Views

Lezione del 17 ottobre 2012

Lezione del 17 ottobre 2012

Lezione del 17 ottobre 2012

SHOW MORE
SHOW LESS

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)

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!