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