SlideShare a Scribd company logo
1 of 56
Differenze tra database nativo IBM i
e Microsoft SQL Server
Riccardo De Mattia
Il presente corso NON ha la pretesa di sostituire i manuali.
Quanto esposto è il risultato di esperienze maturate
nell’utilizzo di entrambi i database.
Differenze tra DB2 nativo IBM i e Microsoft SQL
Raffronto terminologie
Termini di sistema IBM Termini SQL
Libreria (Library) Schema (Schema)
Comprende libreria, giornale e ricevitore
File fisico (Physical file) Tabella (Table)
Per file multi membro usare ALIAS o viste
su membri specifici
Record (Record) Riga (Row)
Campo (Field) Colonna (Column)
Vista logica senza chiavi
(Nonkeyed logical file)
Vista (View)
Le viste in SQL sono sempre *REBUILD
Vista logica con chiavi
(Keyed logical file)
Indice (Index)
Gli indici in SQL non sono articolati come le
viste logiche e non hanno join
Differenze MSSQL-DB2UDB
 Sono moltissime: dal comportamento alla sintassi,
queste sono alcune differenze sostanziali:
 Ordinamento MSSQL ASCII: NULL, numeri, lettere
ordinamento DB2UDB EBCDIC: lettere, numeri, NULL
 Sintassi di clausole anche di base (es. UPDATE,
creazione tabelle da altra tabelle, selezione delle prime n
righe)
 Tipi di dati e loro utilizzo (es. tipo TIMESTAMP in
MSSQL è un ROWNUMBER, in DB2UDB è una DATA +
ORA)
Client standard IBM i e SQL Server
Cwbundbs
 Il client standard di IBM i,
installato come componente
di System i Navigator
 Espandere fino al database
locale poi selezionare
Esegui uno script SQL
Cwbundbs
 Con Esegui e spiega
eseguiamo l’SQL e
visualizziamo il
piano d’esecuzione
Cwbundbs
 Visualizzazione del
piano d’esecuzione
tramite il Visual
Explain
SSMS
 Microsoft SQL Server Management Studio è il client
standard di Microsoft SQL Server
 A partire dalla versione 2008 è possibile utilizzare
l’intellisense per il suggerimento delle colonne e delle
funzioni
Management Studio
 Connettersi all’istanza e selezionare Nuova query
 Digitare la query desiderata
 Selezionare
Includi piano
d’esecuzione
Management Studio
 Visualizzazione del piano di esecuzione di un
comando SQL
Clausole e funzioni di base
SQL e NOSQL
 Breve parentesi storica e tipologie di motori database
 SQL
 Lo Structured Query Language è nato in casa IBM nel 1974
per gestire database relazionali
 Standard adottato dall’ANSI nel 1986 e dall’ISO nel 1987
 Utilizza schemi fissi per la memorizzazione dei dati
 NOSQL
 Il Not Only SQL non utilizza il modello relazionale
 Non usa uno schema fisso
 Usa limitatamente o per nulla le join
 Utilizza spesso una sintassi stile object-oriented
DDL, DML, DQL, DCL
 Data Definition Language
 Porzione dei comandi SQL per la creazione, modifica e
cancellazione degli oggetti quali tabelle, viste ed indici
 Data Modification Language
 Porzione dei comandi SQL per la manipolazione dei dati
 Data Query Language
 Porzione dei comandi SQL per l’interrogazione dei dati
 Data Control Language
 Porzione dei comandi SQL per la gestione dei permessi
Clausole base
 SELECT [ ALL | DISTINCT ] lista_elementi_selezione
FROM lista_riferimenti_tabella
[ WHERE espressione_condizionale ]
[ GROUP BY lista_colonne ]
[ HAVING espressione_condizionale ]
[ ORDER BY lista_colonne ]
SELECT
 Elenco delle colonne da estrarre
 ALL è il valore predefinito, DISTINCT estrae
esclusivamente righe univoche
 Può contenere espressioni anche complesse
 Alias di un campo (rename)
 Espressione AS Nome_Nuovo
 Solo in MSSQL: Nome_Nuovo = Espressione
FROM
 Elenco degli archivi e relazione tra di loro
 Inner join
 Estrae le sole righe in comune tra i due archivi
 Left (right) outer join
 Estrae tutte le righe dell’archivio di sinistra (destra)
 Full outer join
 Estrae tutte le righe sia dell’archivio di sinistra che di quello di
destra
 Left, right e full outer join riempiono di null i valori delle
colonne dell’archivio secondario in assenza di dato
WHERE
 Condizione di selezione
 Può contenere espressioni complesse
GROUP BY
 Esegue un raggruppamento per le colonne elencate
 Le colonne specificate in SELECT devono essere
specificate nella GROUP BY o devono essere sottoposte
a formule (es. COUNT, SUM, MAX, ecc.)
HAVING
 Utilizzabile in presenza di GROUP BY
 Esegue condizioni sul risultato del raggruppamento
(es. MAX(col1) > 100)
 Può contenere espressioni complesse
ORDER BY
 Elenco delle colonne per le quali viene eseguito
l’ordinamento
 Per ogni colonna è possibile specificare l’ordinamento
crescente (ASC, predefinito) o decrescente (DESC)
UNION ed UNION ALL
 UNION permette di eseguire un accodamento di una
tabella o vista ad un’altra
 Vincolo: tutte le tabelle o viste coinvolte devono essere
normalizzate sullo stesso numero e tipo di colonne
 Il nome della colonna viene recuperato dalla prima
tabella o vista elencata
 UNION esegue una DISTINCT implicita, quindi se
non necessaria utilizzare sempre UNION ALL che,
non eseguendo ulteriori operazioni, risulta più veloce
Uso del valore NULL
 NULL indica mancanza di dato o valore sconosciuto, è un valore
speciale diverso da zero e da stringa vuota
 In creazione di una tabella si può decidere se una colonna può
assumere valore NULL
 NULL è diverso da NULL in una qualsiasi comparazione
 per ispezionare il contenuto di un campo occorre utilizzare la sintassi
IS NULL oppure IS NOT NULL
 se durante una join il valore di entrambi i campi di relazione è NULL la
join non è soddisfatta
 NULL sommato o concatenato con qualsiasi valore dà risultato NULL
 è possibile sostituirlo con un qualsivoglia valore utilizzando la funzione
ISNULL(campo, valore_sostitutivo) in MSSQL o, in IBM i con
IFNULL(campo, valore_sostitutivo)
 Anche con tutte le colonne che non accettano valori NULL occorre
saper gestire tale valore in quanto si può presentare nelle OUTER JOIN
COUNT()
 COUNT(*) esegue il conteggio di tutte le righe
 COUNT(espressione) esegue il conteggio delle sole righe in
cui espressione non è NULL
 COUNT( DISTINCT espressione) esegue il conteggio dei
valori univoci in cui espressione non è NULL
 Esempi
 select
count(*) as TotRighe,
count(AnaNazCod) as TotNazCodNotNull,
count(distinct AnaNazCod) as DistinctNazCodNotNull
from Ana
 select AnaNazCod, count(*)
from Ana
group by AnaNazCod
having count(*) > 1
order by AnaNazCod
Estrazione primi «n» record
 DB2UDB
 SELECT * FROM Pratica
ORDER BY PraticaNum DESC
FETCH FIRST 10 ROWS ONLY
 MSSQL
 SELECT TOP 10 * FROM Pratica
ORDER BY PraticaNum DESC
 SELECT TOP 10 PERCENT * FROM Pratica
Conversione tra tipi
 DB2UDB
 SELECT FLOAT(valore)
, DECIMAL(valore, lunghezza, decimali)
, CAST(valore as tipo)
FROM Archivio
 MSSQL
 SELECT CONVERT(FLOAT, valore)
, CONVERT(DECIMAL(lunghezza, decimali),
valore)
, CAST(tipo, valore)
FROM Archivio
Concatenazione
 La concatenazione avviene tra campi alfanumerici, i
tipi numerici devono prima essere convertiti
 DB2UDB
 SELECT concat(fld1, fld2), fld3 || fld4
FROM Archivio
 MSSQL
 SELECT fld1 + fld2
FROM Archivio
Attenzione alle conversioni
 1.938/5 = 0.3876
 DB2UDB
 SELECT DECIMAL(1.938/5, 10, 3) FROM
SYSIBM.SYSDUMMY1;
 Risultato: 0.387
 SELECT ROUND(1.938/5, 3) FROM
SYSIBM.SYSDUMMY1;
 Risultato: 0.388
 MSSQL
 print convert(decimal(10, 3), 1.938/5);
 Risultato: 0.388
 print round(1.938/5, 3, 1);
 Risultato: 0.387
Attenzione all’uso di float
 DB2UDB
 SELECT FLOAT(1)/1 * 0.310 FROM
SYSIBM.SYSDUMMY1;
 Risultato: 0.310
 SELECT DECIMAL(FLOAT(1)/1 * 0.310, 10,
3) FROM SYSIBM.SYSDUMMY1;
 Risultato: 0.309 (!)
 MSSQL
 print convert(decimal(10, 3),
(convert(float, 1)/1 * 0.310));
 Risultato: 0.310
Attenzione ai decimali
 DB2UDB
 CREATE TABLE QTEMP/XVALUE (XVALUE
NUMERIC(30, 9) NOT NULL WITH DEFAULT);
 INSERT INTO QTEMP/XVALUE VALUES(0);
 UPDATE QTEMP/XVALUE SET XVALUE = (1 +
(10.25/100)) * 69.50;
 [SQL0406] Errore di conversione o di
assegnazione alla colonna XVALUE.
 UPDATE QTEMP/XVALUE SET XVALUE = (1 +
(10.25/100.00)) * 69.50;
 UPDATE QTEMP/XVALUE SET XVALUE = (1 +
DECIMAL((10.25/100),10,6)) * 69.50
Row number
 Numera le righe eventualmente all’interno di una
partizione nell’ordine richiesto
 Esempio DB2UDB (valido anche per MSSQL):
select STDITR, STLICD, count(*) as righe,
row_number() over (partition by STDITR
order by STLICD) as riga
from STBORD
group by STDITR, STLICD
order by STDITR, STLICD
Special register
 DB2UDB (esempi)
 CURRENT_SERVER
 USER, SESSION_USER, SYSTEM_USER
 CURRENT SCHEMA, CURRENT_PATH
 CURRENT_DATE
 CURRENT_TIME, CURRENT_TIMESTAMP
 CURRENT_TIMEZONE
Built-in functions
 MSSQL (esempi)
 @@SERVERNAME
 HOST_NAME(), HOST_ID()
 SUSER_SNAME(), CURRENT_USER
 DB_NAME()
 GETDATE(), CURRENT_TIMESTAMP
 GETUTCDATE()
Data / ora attuali
 DB2UDB
 SELECT CURRENT_TIMESTAMP FROM
SYSIBM.SYSDUMMY1
 MSSQL
 Print GetDate()
SUBQUERY
 L’SQL permette l’uso di sottoquery che risultano molto
comode per una elaborazione a più livelli
 Esempio query nidificata
 select * from Dipendenti
where Stipendio > (select avg(Stipendio) from Ana)
 Esempio query derivata
 select *
from Anagrafica a
left join
(select *
from Contatti where Tipo = 'FAX') c
on c.chiaveAna = a.chiave
Archivi temporanei
 DB2UDB
 DECLARE GLOBAL TEMPORARY TABLE
 Crea una tabella in QTEMP
 Referenziabile con QTEMP. o SESSION.
 MSSQL
 CREATE TABLE #nome
 Tabella temporanea del job
 CREATE TABLE ##nome
 Tabella temporanea globale (da evitare)
 DECLARE inmem TABLE (col1 int)
 Tabella inmem creata in memoria
Creazione archivi da query
 DB2UDB
 CREATE TABLE QTEMP.nuova_tabella AS
(SELECT * FROM query_complessa)
WITH DATA;
 MSSQL
 SELECT * INTO #nuova_tabella FROM
query_complessa
Transazione
 DB2UDB
 La singola operazione DELETE o UPDATE avviene
all’interno di una transazione solo su richiesta e solo se
l’archivio si trova sotto journal
 MSSQL
 La singola operazione DELETE o UPDATE avviene
sempre sotto unica transazione
Comandi di sistema
 DB2UDB
 CALL QSYS.QCMDEXC('comando_di_sistema',
lungh.)
 CALL QSYS.QCMDEXC('addlible schema1',
000000016.00000);
 CL: comando_di_sistema
 CL: DSPPGMREF PGM(libreria/(*ALL))
OUTPUT(*OUTFILE) OBJTYPE(*ALL)
OUTFILE(qtemp/dsppgmref);
 SELECT * FROM qtemp.dsppgmref;
Comandi di sistema
 MSSQL
 Attivazione comandi di sistema
 EXEC sp_configure 'xp_cmdshell', 1;
GO
RECONFIGURE;
 Esecuzione comandi di sistema
 EXECUTE xp_cmdshell 'comando_di_sistema';
 Altre utili procedure estese
 sys.xp_delete_file
 sys.xp_dirtree
 sys.xp_fileexist
 sys.xp_fixeddrives
 sys.xp_subdirs
Integrità referenziale, campi identity, unique identifier,
timestamp
Integrità referenziale
 Si attiva a livello di database applicando un legame tra
due tabelle: primaria e correlata
 La chiave univoca della tabella primaria viene associata
ad una o più colonne della tabella secondaria
 Il legame può seguire diverse regole e viene applicato
in caso di cancellazione della riga o dell’aggiornamento
della chiave sulla tabella primaria
Integrità referenziale
 Regole tipiche su modifica e cancellazione:
 Nessuna azione
 le richieste sono rifiutate quando la chiave esiste su una tabella
correlata
 Cascata
 applica la cancellazione o l’aggiornamento richiesto alla tabella
correlata
 Imposta valore nullo
 se modificata o eliminata la chiave primaria il valore sulla correlata
viene impostato a nullo
 Imposta valore predefinito
 se modificata o eliminata la chiave primaria il valore sulla correlata
viene impostato al valore predefinito
Identity
 È un attributo da assegnare ad una colonna numerica
che attiva l’assegnazione automatica del progressivo
 Utilizzato per l’identificazione univoca del record
 Esempio DB2UDB
 CREATE TABLE Anagra (Chiave INTEGER
GENERATED ALWAYS AS IDENTITY (START WITH
1 INCREMENT BY 1), Nome CHAR(35))
 Esempio MSSQL
 CREATE TABLE Anagra (Chiave INT
IDENTITY(1, 1), Nome CHAR(35))
Unique identifier o row id
 Assegnato quale tipologia di dato ad una colonna
 Utilizzato per l’identificazione univoca del record in
alternativa ad Identity
 Esempio di GUID:
E6514E30-EE82-4B22-B8C3-5DE076F9DFB3
Unique identifier o row id
 Creazione tabella con chiave GUID
 Esempio DB2UDB
 CREATE TABLE Test
(col1 ROWID GENERATED ALWAYS
, col2 DATE)
 Esempio MSSQL
 CREATE TABLE Test (TestKy uniqueidentifier
ROWGUIDCOL NOT NULL, TestNum int)
 ALTER TABLE Test ADD CONSTRAINT
DF_Test_TestKy DEFAULT (newid()) FOR TestKy
Timestamp
 Assegnato quale tipologia di dato ad una colonna
 DB2UDB
 Se impostato anche il valore predefinito SQL inserirà un
valore univoco alla riga identificandone il momento
esatto di ultima modifica
 CREATE TABLE Pratica (PraticaTimeStamp
TIMESTAMP DEFAULT CURRENT TIMESTAMP)
 MSSQL
 Sempre impostato automaticamente dal DB
 CREATE TABLE Pratica (PraticaTimeStamp
TIMESTAMP)
Come funziona il motore SQL
Comandi SQL
 Vi sono diversi tipi di comandi SQL, ci
concentreremo sulle chiamate d’interrogazione,
ovvero la query di selezione.
Esecuzione di una query
 Passaggi
 Parsing
 Verifica correttezza
 Identificazione delle parti, normalmente trasformata in un
albero (query tree)
 Standardizzazione
 Eliminazione clausole ridondanti
 Arrangiamento albero
 Ottimizzazione
Esecuzione di una query
 Tipi di ottimizzazione
 Sintattica
 Basata sulla «fiducia» in chi ha scritto la query
 Cost-based (la più utilizzata)
 Basata su statistiche (dimensione tabelle, distribuzione dei
dati, disponibilità di indici, ecc.)
 Euristica
 Trasformazione albero in espressioni algebrico-relazionali e
riduzione ai termini di base
 Semantica
 Eliminazione di rami inutili, l’ottimizzatore deve
«conoscere» il db sottostante
Esecuzione di una query
 Processo di ottimizzazione (cost-based)
 Scelta degli indici
 Richiede una corrispondenza esatta dei primi campi
dell’indice con la join e/o con la condizione where
 Selezione delle join
 Il motore elabora una coppia di archivi alla volta, l’ordine di
elaborazione è basato sul costo attribuito ad ogni join ed il
risultato potrebbe essere diverso da quello che ci si aspetta
Scelta vista (indice) su host
 Tramite Visual Explain è possibile visualizzare
graficamente il piano di esecuzione utilizzato dal
motore SQL per estrarre i dati richiesti
 Nel seguente esempio, nonostante la query sia richiesta
sulla vista MOVCON07, l’ottimizzatore decide di usare
l’indice MOVCON10 che gli permette di estrarre i dati
più velocemente per il campo REGGDT
 select *
from MOVCON07
where REGGDT between 20000000 and 20009999
Alcuni esempi di comandi SQL
• IBM – Knowledge Center
http://www-01.ibm.com/support/knowledgecenter/ssw_ibm_i_61/welcome.html?lang=en
• IBM - V6R1 DB2 for i SQL Reference
http://publib.boulder.ibm.com/infocenter/iseries/v6r1m0/topic/db2/rbafz.pdf
• IBM - V6R1 Database SQL programming
http://publib.boulder.ibm.com/infocenter/iseries/v6r1m0/topic/sqlp/rbafy.pdf
• Microsoft – MSDN
http://msdn.microsoft.com/it-it/library/bb545450(v=msdn.10%20).aspx

More Related Content

Viewers also liked

Intro OPENSUITE09NR.pdf
Intro OPENSUITE09NR.pdfIntro OPENSUITE09NR.pdf
Intro OPENSUITE09NR.pdfMayking
 
Creazione di una partizione Linux ospitata da IBM i tramite VPM
Creazione di una partizione Linux ospitata da IBM i tramite VPMCreazione di una partizione Linux ospitata da IBM i tramite VPM
Creazione di una partizione Linux ospitata da IBM i tramite VPMS.info Srl
 
Tutte le novità di IBM i V7R2
Tutte le novità di IBM i V7R2Tutte le novità di IBM i V7R2
Tutte le novità di IBM i V7R2S.info Srl
 
Virtualizzazione Power IBM
Virtualizzazione Power IBMVirtualizzazione Power IBM
Virtualizzazione Power IBMS.info Srl
 
HelpSystems - How to Upgrade to IBM i 7.3
HelpSystems - How to Upgrade to IBM i 7.3HelpSystems - How to Upgrade to IBM i 7.3
HelpSystems - How to Upgrade to IBM i 7.3HelpSystems
 
IBM i client partitions concepts and implementation
IBM i client partitions concepts and implementationIBM i client partitions concepts and implementation
IBM i client partitions concepts and implementationCOMMON Europe
 
How to Upgrade to IBM i 7.2
How to Upgrade to IBM i 7.2 How to Upgrade to IBM i 7.2
How to Upgrade to IBM i 7.2 HelpSystems
 
Introduction to the IBM AS/400
Introduction to the IBM AS/400Introduction to the IBM AS/400
Introduction to the IBM AS/400tvlooy
 

Viewers also liked (8)

Intro OPENSUITE09NR.pdf
Intro OPENSUITE09NR.pdfIntro OPENSUITE09NR.pdf
Intro OPENSUITE09NR.pdf
 
Creazione di una partizione Linux ospitata da IBM i tramite VPM
Creazione di una partizione Linux ospitata da IBM i tramite VPMCreazione di una partizione Linux ospitata da IBM i tramite VPM
Creazione di una partizione Linux ospitata da IBM i tramite VPM
 
Tutte le novità di IBM i V7R2
Tutte le novità di IBM i V7R2Tutte le novità di IBM i V7R2
Tutte le novità di IBM i V7R2
 
Virtualizzazione Power IBM
Virtualizzazione Power IBMVirtualizzazione Power IBM
Virtualizzazione Power IBM
 
HelpSystems - How to Upgrade to IBM i 7.3
HelpSystems - How to Upgrade to IBM i 7.3HelpSystems - How to Upgrade to IBM i 7.3
HelpSystems - How to Upgrade to IBM i 7.3
 
IBM i client partitions concepts and implementation
IBM i client partitions concepts and implementationIBM i client partitions concepts and implementation
IBM i client partitions concepts and implementation
 
How to Upgrade to IBM i 7.2
How to Upgrade to IBM i 7.2 How to Upgrade to IBM i 7.2
How to Upgrade to IBM i 7.2
 
Introduction to the IBM AS/400
Introduction to the IBM AS/400Introduction to the IBM AS/400
Introduction to the IBM AS/400
 

Similar to IBM i db2 udb vs Microsoft SQL Server

corso oracle plsql.ppt
corso oracle plsql.pptcorso oracle plsql.ppt
corso oracle plsql.pptssuserf7962d
 
corso web - Introduzione ai Database
corso web - Introduzione ai Databasecorso web - Introduzione ai Database
corso web - Introduzione ai DatabaseRiccardo Piccioni
 
Novità di SQL Server 2017
Novità di SQL Server 2017Novità di SQL Server 2017
Novità di SQL Server 2017Gianluca Hotz
 
Python advanced 01-numpypandas
Python advanced 01-numpypandasPython advanced 01-numpypandas
Python advanced 01-numpypandasStudiabo
 
Python advanced 01-numpypandas
Python advanced 01-numpypandasPython advanced 01-numpypandas
Python advanced 01-numpypandasStudiabo
 
Py a6 python-database
Py a6 python-databasePy a6 python-database
Py a6 python-databaseMajong DevJfu
 
Creare tabelle sul database MySql
Creare tabelle sul database MySqlCreare tabelle sul database MySql
Creare tabelle sul database MySqlNicola Iantomasi
 
Access parte terza
Access parte terzaAccess parte terza
Access parte terzaMatekanc
 
Strutture dati 05-numpypandas
Strutture dati 05-numpypandasStrutture dati 05-numpypandas
Strutture dati 05-numpypandasStudiabo
 
MongoDB
MongoDBMongoDB
MongoDBNaLUG
 
Ldb 25 strumenti gis e webgis_2014-05-15 gullotta - 4 tabelle attributi e lor...
Ldb 25 strumenti gis e webgis_2014-05-15 gullotta - 4 tabelle attributi e lor...Ldb 25 strumenti gis e webgis_2014-05-15 gullotta - 4 tabelle attributi e lor...
Ldb 25 strumenti gis e webgis_2014-05-15 gullotta - 4 tabelle attributi e lor...laboratoridalbasso
 

Similar to IBM i db2 udb vs Microsoft SQL Server (20)

Basi Di Dati 03
Basi Di Dati 03Basi Di Dati 03
Basi Di Dati 03
 
Oracle PL sql 1
Oracle PL sql 1Oracle PL sql 1
Oracle PL sql 1
 
corso oracle plsql.ppt
corso oracle plsql.pptcorso oracle plsql.ppt
corso oracle plsql.ppt
 
Sql 1
Sql 1Sql 1
Sql 1
 
Sql stored procedures
Sql stored proceduresSql stored procedures
Sql stored procedures
 
corso web - Introduzione ai Database
corso web - Introduzione ai Databasecorso web - Introduzione ai Database
corso web - Introduzione ai Database
 
Novità di SQL Server 2017
Novità di SQL Server 2017Novità di SQL Server 2017
Novità di SQL Server 2017
 
Java lezione 10
Java lezione 10Java lezione 10
Java lezione 10
 
Sql ddl
Sql ddlSql ddl
Sql ddl
 
Python advanced 01-numpypandas
Python advanced 01-numpypandasPython advanced 01-numpypandas
Python advanced 01-numpypandas
 
Python advanced 01-numpypandas
Python advanced 01-numpypandasPython advanced 01-numpypandas
Python advanced 01-numpypandas
 
Py a6 python-database
Py a6 python-databasePy a6 python-database
Py a6 python-database
 
Creare tabelle sul database MySql
Creare tabelle sul database MySqlCreare tabelle sul database MySql
Creare tabelle sul database MySql
 
Access parte terza
Access parte terzaAccess parte terza
Access parte terza
 
Oracle 2 (sqlplus)
Oracle 2 (sqlplus)Oracle 2 (sqlplus)
Oracle 2 (sqlplus)
 
What's new in C# 7
What's new in C# 7What's new in C# 7
What's new in C# 7
 
Strutture dati 05-numpypandas
Strutture dati 05-numpypandasStrutture dati 05-numpypandas
Strutture dati 05-numpypandas
 
MongoDB
MongoDBMongoDB
MongoDB
 
Ldb 25 strumenti gis e webgis_2014-05-15 gullotta - 4 tabelle attributi e lor...
Ldb 25 strumenti gis e webgis_2014-05-15 gullotta - 4 tabelle attributi e lor...Ldb 25 strumenti gis e webgis_2014-05-15 gullotta - 4 tabelle attributi e lor...
Ldb 25 strumenti gis e webgis_2014-05-15 gullotta - 4 tabelle attributi e lor...
 
Basi Di Dati 05
Basi Di Dati 05Basi Di Dati 05
Basi Di Dati 05
 

IBM i db2 udb vs Microsoft SQL Server

  • 1. Differenze tra database nativo IBM i e Microsoft SQL Server Riccardo De Mattia
  • 2. Il presente corso NON ha la pretesa di sostituire i manuali. Quanto esposto è il risultato di esperienze maturate nell’utilizzo di entrambi i database.
  • 3. Differenze tra DB2 nativo IBM i e Microsoft SQL
  • 4. Raffronto terminologie Termini di sistema IBM Termini SQL Libreria (Library) Schema (Schema) Comprende libreria, giornale e ricevitore File fisico (Physical file) Tabella (Table) Per file multi membro usare ALIAS o viste su membri specifici Record (Record) Riga (Row) Campo (Field) Colonna (Column) Vista logica senza chiavi (Nonkeyed logical file) Vista (View) Le viste in SQL sono sempre *REBUILD Vista logica con chiavi (Keyed logical file) Indice (Index) Gli indici in SQL non sono articolati come le viste logiche e non hanno join
  • 5. Differenze MSSQL-DB2UDB  Sono moltissime: dal comportamento alla sintassi, queste sono alcune differenze sostanziali:  Ordinamento MSSQL ASCII: NULL, numeri, lettere ordinamento DB2UDB EBCDIC: lettere, numeri, NULL  Sintassi di clausole anche di base (es. UPDATE, creazione tabelle da altra tabelle, selezione delle prime n righe)  Tipi di dati e loro utilizzo (es. tipo TIMESTAMP in MSSQL è un ROWNUMBER, in DB2UDB è una DATA + ORA)
  • 6. Client standard IBM i e SQL Server
  • 7. Cwbundbs  Il client standard di IBM i, installato come componente di System i Navigator  Espandere fino al database locale poi selezionare Esegui uno script SQL
  • 8. Cwbundbs  Con Esegui e spiega eseguiamo l’SQL e visualizziamo il piano d’esecuzione
  • 9. Cwbundbs  Visualizzazione del piano d’esecuzione tramite il Visual Explain
  • 10. SSMS  Microsoft SQL Server Management Studio è il client standard di Microsoft SQL Server  A partire dalla versione 2008 è possibile utilizzare l’intellisense per il suggerimento delle colonne e delle funzioni
  • 11. Management Studio  Connettersi all’istanza e selezionare Nuova query  Digitare la query desiderata  Selezionare Includi piano d’esecuzione
  • 12. Management Studio  Visualizzazione del piano di esecuzione di un comando SQL
  • 14. SQL e NOSQL  Breve parentesi storica e tipologie di motori database  SQL  Lo Structured Query Language è nato in casa IBM nel 1974 per gestire database relazionali  Standard adottato dall’ANSI nel 1986 e dall’ISO nel 1987  Utilizza schemi fissi per la memorizzazione dei dati  NOSQL  Il Not Only SQL non utilizza il modello relazionale  Non usa uno schema fisso  Usa limitatamente o per nulla le join  Utilizza spesso una sintassi stile object-oriented
  • 15. DDL, DML, DQL, DCL  Data Definition Language  Porzione dei comandi SQL per la creazione, modifica e cancellazione degli oggetti quali tabelle, viste ed indici  Data Modification Language  Porzione dei comandi SQL per la manipolazione dei dati  Data Query Language  Porzione dei comandi SQL per l’interrogazione dei dati  Data Control Language  Porzione dei comandi SQL per la gestione dei permessi
  • 16. Clausole base  SELECT [ ALL | DISTINCT ] lista_elementi_selezione FROM lista_riferimenti_tabella [ WHERE espressione_condizionale ] [ GROUP BY lista_colonne ] [ HAVING espressione_condizionale ] [ ORDER BY lista_colonne ]
  • 17. SELECT  Elenco delle colonne da estrarre  ALL è il valore predefinito, DISTINCT estrae esclusivamente righe univoche  Può contenere espressioni anche complesse  Alias di un campo (rename)  Espressione AS Nome_Nuovo  Solo in MSSQL: Nome_Nuovo = Espressione
  • 18. FROM  Elenco degli archivi e relazione tra di loro  Inner join  Estrae le sole righe in comune tra i due archivi  Left (right) outer join  Estrae tutte le righe dell’archivio di sinistra (destra)  Full outer join  Estrae tutte le righe sia dell’archivio di sinistra che di quello di destra  Left, right e full outer join riempiono di null i valori delle colonne dell’archivio secondario in assenza di dato
  • 19. WHERE  Condizione di selezione  Può contenere espressioni complesse
  • 20. GROUP BY  Esegue un raggruppamento per le colonne elencate  Le colonne specificate in SELECT devono essere specificate nella GROUP BY o devono essere sottoposte a formule (es. COUNT, SUM, MAX, ecc.)
  • 21. HAVING  Utilizzabile in presenza di GROUP BY  Esegue condizioni sul risultato del raggruppamento (es. MAX(col1) > 100)  Può contenere espressioni complesse
  • 22. ORDER BY  Elenco delle colonne per le quali viene eseguito l’ordinamento  Per ogni colonna è possibile specificare l’ordinamento crescente (ASC, predefinito) o decrescente (DESC)
  • 23. UNION ed UNION ALL  UNION permette di eseguire un accodamento di una tabella o vista ad un’altra  Vincolo: tutte le tabelle o viste coinvolte devono essere normalizzate sullo stesso numero e tipo di colonne  Il nome della colonna viene recuperato dalla prima tabella o vista elencata  UNION esegue una DISTINCT implicita, quindi se non necessaria utilizzare sempre UNION ALL che, non eseguendo ulteriori operazioni, risulta più veloce
  • 24. Uso del valore NULL  NULL indica mancanza di dato o valore sconosciuto, è un valore speciale diverso da zero e da stringa vuota  In creazione di una tabella si può decidere se una colonna può assumere valore NULL  NULL è diverso da NULL in una qualsiasi comparazione  per ispezionare il contenuto di un campo occorre utilizzare la sintassi IS NULL oppure IS NOT NULL  se durante una join il valore di entrambi i campi di relazione è NULL la join non è soddisfatta  NULL sommato o concatenato con qualsiasi valore dà risultato NULL  è possibile sostituirlo con un qualsivoglia valore utilizzando la funzione ISNULL(campo, valore_sostitutivo) in MSSQL o, in IBM i con IFNULL(campo, valore_sostitutivo)  Anche con tutte le colonne che non accettano valori NULL occorre saper gestire tale valore in quanto si può presentare nelle OUTER JOIN
  • 25. COUNT()  COUNT(*) esegue il conteggio di tutte le righe  COUNT(espressione) esegue il conteggio delle sole righe in cui espressione non è NULL  COUNT( DISTINCT espressione) esegue il conteggio dei valori univoci in cui espressione non è NULL  Esempi  select count(*) as TotRighe, count(AnaNazCod) as TotNazCodNotNull, count(distinct AnaNazCod) as DistinctNazCodNotNull from Ana  select AnaNazCod, count(*) from Ana group by AnaNazCod having count(*) > 1 order by AnaNazCod
  • 26. Estrazione primi «n» record  DB2UDB  SELECT * FROM Pratica ORDER BY PraticaNum DESC FETCH FIRST 10 ROWS ONLY  MSSQL  SELECT TOP 10 * FROM Pratica ORDER BY PraticaNum DESC  SELECT TOP 10 PERCENT * FROM Pratica
  • 27. Conversione tra tipi  DB2UDB  SELECT FLOAT(valore) , DECIMAL(valore, lunghezza, decimali) , CAST(valore as tipo) FROM Archivio  MSSQL  SELECT CONVERT(FLOAT, valore) , CONVERT(DECIMAL(lunghezza, decimali), valore) , CAST(tipo, valore) FROM Archivio
  • 28. Concatenazione  La concatenazione avviene tra campi alfanumerici, i tipi numerici devono prima essere convertiti  DB2UDB  SELECT concat(fld1, fld2), fld3 || fld4 FROM Archivio  MSSQL  SELECT fld1 + fld2 FROM Archivio
  • 29. Attenzione alle conversioni  1.938/5 = 0.3876  DB2UDB  SELECT DECIMAL(1.938/5, 10, 3) FROM SYSIBM.SYSDUMMY1;  Risultato: 0.387  SELECT ROUND(1.938/5, 3) FROM SYSIBM.SYSDUMMY1;  Risultato: 0.388  MSSQL  print convert(decimal(10, 3), 1.938/5);  Risultato: 0.388  print round(1.938/5, 3, 1);  Risultato: 0.387
  • 30. Attenzione all’uso di float  DB2UDB  SELECT FLOAT(1)/1 * 0.310 FROM SYSIBM.SYSDUMMY1;  Risultato: 0.310  SELECT DECIMAL(FLOAT(1)/1 * 0.310, 10, 3) FROM SYSIBM.SYSDUMMY1;  Risultato: 0.309 (!)  MSSQL  print convert(decimal(10, 3), (convert(float, 1)/1 * 0.310));  Risultato: 0.310
  • 31. Attenzione ai decimali  DB2UDB  CREATE TABLE QTEMP/XVALUE (XVALUE NUMERIC(30, 9) NOT NULL WITH DEFAULT);  INSERT INTO QTEMP/XVALUE VALUES(0);  UPDATE QTEMP/XVALUE SET XVALUE = (1 + (10.25/100)) * 69.50;  [SQL0406] Errore di conversione o di assegnazione alla colonna XVALUE.  UPDATE QTEMP/XVALUE SET XVALUE = (1 + (10.25/100.00)) * 69.50;  UPDATE QTEMP/XVALUE SET XVALUE = (1 + DECIMAL((10.25/100),10,6)) * 69.50
  • 32. Row number  Numera le righe eventualmente all’interno di una partizione nell’ordine richiesto  Esempio DB2UDB (valido anche per MSSQL): select STDITR, STLICD, count(*) as righe, row_number() over (partition by STDITR order by STLICD) as riga from STBORD group by STDITR, STLICD order by STDITR, STLICD
  • 33. Special register  DB2UDB (esempi)  CURRENT_SERVER  USER, SESSION_USER, SYSTEM_USER  CURRENT SCHEMA, CURRENT_PATH  CURRENT_DATE  CURRENT_TIME, CURRENT_TIMESTAMP  CURRENT_TIMEZONE
  • 34. Built-in functions  MSSQL (esempi)  @@SERVERNAME  HOST_NAME(), HOST_ID()  SUSER_SNAME(), CURRENT_USER  DB_NAME()  GETDATE(), CURRENT_TIMESTAMP  GETUTCDATE()
  • 35. Data / ora attuali  DB2UDB  SELECT CURRENT_TIMESTAMP FROM SYSIBM.SYSDUMMY1  MSSQL  Print GetDate()
  • 36. SUBQUERY  L’SQL permette l’uso di sottoquery che risultano molto comode per una elaborazione a più livelli  Esempio query nidificata  select * from Dipendenti where Stipendio > (select avg(Stipendio) from Ana)  Esempio query derivata  select * from Anagrafica a left join (select * from Contatti where Tipo = 'FAX') c on c.chiaveAna = a.chiave
  • 37. Archivi temporanei  DB2UDB  DECLARE GLOBAL TEMPORARY TABLE  Crea una tabella in QTEMP  Referenziabile con QTEMP. o SESSION.  MSSQL  CREATE TABLE #nome  Tabella temporanea del job  CREATE TABLE ##nome  Tabella temporanea globale (da evitare)  DECLARE inmem TABLE (col1 int)  Tabella inmem creata in memoria
  • 38. Creazione archivi da query  DB2UDB  CREATE TABLE QTEMP.nuova_tabella AS (SELECT * FROM query_complessa) WITH DATA;  MSSQL  SELECT * INTO #nuova_tabella FROM query_complessa
  • 39. Transazione  DB2UDB  La singola operazione DELETE o UPDATE avviene all’interno di una transazione solo su richiesta e solo se l’archivio si trova sotto journal  MSSQL  La singola operazione DELETE o UPDATE avviene sempre sotto unica transazione
  • 40. Comandi di sistema  DB2UDB  CALL QSYS.QCMDEXC('comando_di_sistema', lungh.)  CALL QSYS.QCMDEXC('addlible schema1', 000000016.00000);  CL: comando_di_sistema  CL: DSPPGMREF PGM(libreria/(*ALL)) OUTPUT(*OUTFILE) OBJTYPE(*ALL) OUTFILE(qtemp/dsppgmref);  SELECT * FROM qtemp.dsppgmref;
  • 41. Comandi di sistema  MSSQL  Attivazione comandi di sistema  EXEC sp_configure 'xp_cmdshell', 1; GO RECONFIGURE;  Esecuzione comandi di sistema  EXECUTE xp_cmdshell 'comando_di_sistema';  Altre utili procedure estese  sys.xp_delete_file  sys.xp_dirtree  sys.xp_fileexist  sys.xp_fixeddrives  sys.xp_subdirs
  • 42. Integrità referenziale, campi identity, unique identifier, timestamp
  • 43. Integrità referenziale  Si attiva a livello di database applicando un legame tra due tabelle: primaria e correlata  La chiave univoca della tabella primaria viene associata ad una o più colonne della tabella secondaria  Il legame può seguire diverse regole e viene applicato in caso di cancellazione della riga o dell’aggiornamento della chiave sulla tabella primaria
  • 44. Integrità referenziale  Regole tipiche su modifica e cancellazione:  Nessuna azione  le richieste sono rifiutate quando la chiave esiste su una tabella correlata  Cascata  applica la cancellazione o l’aggiornamento richiesto alla tabella correlata  Imposta valore nullo  se modificata o eliminata la chiave primaria il valore sulla correlata viene impostato a nullo  Imposta valore predefinito  se modificata o eliminata la chiave primaria il valore sulla correlata viene impostato al valore predefinito
  • 45. Identity  È un attributo da assegnare ad una colonna numerica che attiva l’assegnazione automatica del progressivo  Utilizzato per l’identificazione univoca del record  Esempio DB2UDB  CREATE TABLE Anagra (Chiave INTEGER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1), Nome CHAR(35))  Esempio MSSQL  CREATE TABLE Anagra (Chiave INT IDENTITY(1, 1), Nome CHAR(35))
  • 46. Unique identifier o row id  Assegnato quale tipologia di dato ad una colonna  Utilizzato per l’identificazione univoca del record in alternativa ad Identity  Esempio di GUID: E6514E30-EE82-4B22-B8C3-5DE076F9DFB3
  • 47. Unique identifier o row id  Creazione tabella con chiave GUID  Esempio DB2UDB  CREATE TABLE Test (col1 ROWID GENERATED ALWAYS , col2 DATE)  Esempio MSSQL  CREATE TABLE Test (TestKy uniqueidentifier ROWGUIDCOL NOT NULL, TestNum int)  ALTER TABLE Test ADD CONSTRAINT DF_Test_TestKy DEFAULT (newid()) FOR TestKy
  • 48. Timestamp  Assegnato quale tipologia di dato ad una colonna  DB2UDB  Se impostato anche il valore predefinito SQL inserirà un valore univoco alla riga identificandone il momento esatto di ultima modifica  CREATE TABLE Pratica (PraticaTimeStamp TIMESTAMP DEFAULT CURRENT TIMESTAMP)  MSSQL  Sempre impostato automaticamente dal DB  CREATE TABLE Pratica (PraticaTimeStamp TIMESTAMP)
  • 49. Come funziona il motore SQL
  • 50. Comandi SQL  Vi sono diversi tipi di comandi SQL, ci concentreremo sulle chiamate d’interrogazione, ovvero la query di selezione.
  • 51. Esecuzione di una query  Passaggi  Parsing  Verifica correttezza  Identificazione delle parti, normalmente trasformata in un albero (query tree)  Standardizzazione  Eliminazione clausole ridondanti  Arrangiamento albero  Ottimizzazione
  • 52. Esecuzione di una query  Tipi di ottimizzazione  Sintattica  Basata sulla «fiducia» in chi ha scritto la query  Cost-based (la più utilizzata)  Basata su statistiche (dimensione tabelle, distribuzione dei dati, disponibilità di indici, ecc.)  Euristica  Trasformazione albero in espressioni algebrico-relazionali e riduzione ai termini di base  Semantica  Eliminazione di rami inutili, l’ottimizzatore deve «conoscere» il db sottostante
  • 53. Esecuzione di una query  Processo di ottimizzazione (cost-based)  Scelta degli indici  Richiede una corrispondenza esatta dei primi campi dell’indice con la join e/o con la condizione where  Selezione delle join  Il motore elabora una coppia di archivi alla volta, l’ordine di elaborazione è basato sul costo attribuito ad ogni join ed il risultato potrebbe essere diverso da quello che ci si aspetta
  • 54. Scelta vista (indice) su host  Tramite Visual Explain è possibile visualizzare graficamente il piano di esecuzione utilizzato dal motore SQL per estrarre i dati richiesti  Nel seguente esempio, nonostante la query sia richiesta sulla vista MOVCON07, l’ottimizzatore decide di usare l’indice MOVCON10 che gli permette di estrarre i dati più velocemente per il campo REGGDT  select * from MOVCON07 where REGGDT between 20000000 and 20009999
  • 55. Alcuni esempi di comandi SQL
  • 56. • IBM – Knowledge Center http://www-01.ibm.com/support/knowledgecenter/ssw_ibm_i_61/welcome.html?lang=en • IBM - V6R1 DB2 for i SQL Reference http://publib.boulder.ibm.com/infocenter/iseries/v6r1m0/topic/db2/rbafz.pdf • IBM - V6R1 Database SQL programming http://publib.boulder.ibm.com/infocenter/iseries/v6r1m0/topic/sqlp/rbafy.pdf • Microsoft – MSDN http://msdn.microsoft.com/it-it/library/bb545450(v=msdn.10%20).aspx