Basi di Dati
description
Transcript of Basi di Dati
G. Mecca – [email protected] – Università della BasilicataG. Mecca – [email protected] – Università della Basilicata
Basi di Dati
Progettazione Fisica e “Tuning”:Concetti Avanzati
versione 2.0
Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina)
2G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Concetti Avanzati Introduzione Ottimizzazione delle Interrogazioni
Un Esempio Messa a Punto (“Tuning”)
Carico ApplicativoStrutture di AccessoModifiche allo Schema LogicoParametri Architetturali
Progettazione Fisica e Tuning >> Sommario
3G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Introduzione Processo di Progettazione della BD
“progettazione logica”: dallo schema concettuale viene derivato: uno schema logico standardgli schemi esterni necessari
“progettazione fisica”: a partire dallo schema logico viene derivato:uno schema fisico (strutture di accesso)uno schema logico ottimizzato
Progettazione Fisica e Tuning >> Concetti Avanzati >> Introduzione
4G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Introduzione Progettazione Logica
l’obiettivo è fare in modo che la base di dati sia normalizzata (priva di anomalie)
algoritmo sistematico Progettazione Fisica
l’obiettivo è fare in modo che la operazioni sulla base di dati siano efficienti
problema poco sistematizzabile
Progettazione Fisica e Tuning >> Concetti Avanzati >> Introduzione
5G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Progettazione Fisica L’obiettivo sono le prestazioni
si interviene su parametri che le influenzano Parametri che influenzano le prestazioni
organizzazione dei file e strutture di accessoschema logicooperazioni (query e transazioni)parametri dell’architettura (buffer, dischi ecc.)
Questi aspetti sono difficili da progettare
Progettazione Fisica e Tuning >> Concetti Avanzati >> Introduzione
6G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Messa a Punto (“Tuning”) Tipicamente
si comincia con lo schema standardle strutture di accesso standardsi accumula informazione sul funzionamento
e si valutano le prestazionisulla base dei dati raccolti si procede alla
messa a punto dei parametriè un’attività condotta periodicamente
Progettazione Fisica e Tuning >> Concetti Avanzati >> Introduzione
7G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Messa a Punto (“Tuning”) In questa lezione
panoramica sulla progettazione fisica e il tuning
discuteremo le principali classi di parametridescriveremo delle linee guidanon c’è la pretesa di essere esaustivi
Punto di partenzavalutazione e ottimizzazione delle
interrogazioni in un DBMS relazionale
Progettazione Fisica e Tuning >> Concetti Avanzati >> Introduzione
8G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Ottimizzazione delle Interrogazioni Processo di valutazione di una query
la query viene inviata al DBMS interattivamente o da un’applicazione
il DBMS effettua l’analisi sintattica del codice SQL
il DBMS effettua le verifiche sulle autorizzazioni di accesso
il DBMS esegue il processo di ottimizzazione della query
Progettazione Fisica e Tuning >> Concetti Avanzati >> Ottimizzazione
9G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Ottimizzazione delle Interrogazioni Processo di ottimizzazione
scelta di una strategia efficiente per la valutazione della query
Piano di esecuzione di una queryscelta dell’ordine di applicazione degli
operatori algebrici necessaristrategia di calcolo del risultato di ciascun
operatore algebrico attraverso le strutture di accesso disponibili
Progettazione Fisica e Tuning >> Concetti Avanzati >> Ottimizzazione
10G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Ottimizzazione delle Interrogazioni Per effettuare l’ottimizzazione
vengono valutati molti diversi piani di esecuzione alternativi
l’ottimizzatore dispone di statistiche sul contenuto della base di dati (dimensione delle tabelle, dimensione dei record, dimensione degli indici, selettività ecc.)
sulla base delle statistiche viene stimato il costo di ciascun piano di esecuzione (numero di accessi ai blocchi su disco)
Progettazione Fisica e Tuning >> Concetti Avanzati >> Ottimizzazione
11G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Un Esempio Consideriamo la base di dati universitaria
Progettazione Fisica e Tuning >> Concetti Avanzati >> Ottimizzazione
CREATE TABLE Studente ( matricola integer PRIMARY KEY, cognome varchar(20) NOT NULL, nome varchar(20) NOT NULL, ciclo char(20), anno integer, relatore char(4) REFERENCES Docente(codice) );
CREATE TABLE Docente ( codice char(4) PRIMARY KEY, cognome varchar(20) NOT NULL, nome varchar(20) NOT NULL, qualifica char(15), facolta char(10) );
12G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Un Esempio Studiamo la seguente interrogazione:
“Nomi e cognomi dei tesisti di Christian Vieri iscritti alla laurea specialistica”
Progettazione Fisica e Tuning >> Concetti Avanzati >> Ottimizzazione
SELECT Studente.nome, Studente.cognomeFROM Docente, StudenteWHERE Docente.codice=Studente.relatore AND Studente.ciclo = ‘laurea sp.’ AND Docente.cognome = ‘Vieri’;
13G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Un Esempio Forma standard
Progettazione Fisica e Tuning >> Concetti Avanzati >> Ottimizzazione
SELECT S.nome, S.cognomeFROM Docente AS D, Studente AS SWHERE D.codice=S.relatore AND S.ciclo = ‘laurea sp.’ AND D.cognome = ‘Vieri’; S D
S.nome, S.cognome
D.codice=S.relatore AND S.ciclo=‘laurea sp.’ AND D.cognome=‘Vieri’
X
S.nome, S.cognome D.codice=S.relatore AND S.ciclo=‘laurea sp.’ AND D.cognome=‘Vieri’
(S X D) )
Albero degli operatori della query
14G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Un Esempio Non è l’unico possibile
Progettazione Fisica e Tuning >> Concetti Avanzati >> Ottimizzazione
S D
S.nome, S.cognome
D.codice=S.relatore AND S.ciclo=‘laurea sp.’ AND D.cognome=‘Vieri’
X
Piano A S D
S.ciclo=‘laurea sp.’ AND D.cognome=‘Vieri’
S.nome, S.cognome
D.codice=S.relatore
Piano B
15G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Un Esempio In generale un ottimizzatore dovrebbe
preferire il piano B al piano Ai prodotti cartesiani sono costosi
In altri casi peròl’albero degli operatori da solo non basta a
stabilire se una strategia è migliore di un’altraè necessario considerare le strutture di
accesso disponibili
Progettazione Fisica e Tuning >> Concetti Avanzati >> Ottimizzazione
16G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Altri Piani di Esecuzione
Progettazione Fisica e Tuning >> Concetti Avanzati >> Ottimizzazione
S D
S.ciclo= ‘laurea sp.’
S.nome, S.cognome
D.codice=S.relatore
Piano C
D.cognome =‘Vieri’
S
S.ciclo=‘laurea sp.’
S.nome, S.cognome
D
D.codice=S.relatore
Piano D
D.cognome =‘Vieri’
17G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Un Esempio In generale
il piano C è migliore di A e di Bin alcune condizioni il piano D è migliore di C
Dipende dalla strategia utilizzata per valutare gli operatoriin particolare dall’organizzazione dei filee dalle strutture di accesso (indici)
Progettazione Fisica e Tuning >> Concetti Avanzati >> Ottimizzazione
18G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Esecuzione di un Operatore Algebrico Tre tecniche principali Scansione lineare del file
inefficiente, applicabile solo a file piccoli Accesso attraverso indici
assume la presenza di indici (aggiornamenti) Raggruppamento temporaneo
creazione di strutture aggiuntive per raggruppare le ennuple (es: ordinamenti, tabelle di hash in memoria centrale)
Progettazione Fisica e Tuning >> Concetti Avanzati >> Ottimizzazione
19G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Esecuzione di una Selezione con Ug. File non ordinato, nessun indice rilevante
scansione lineare del file File ordinato per l’attributo, nessun indice
ricerca binaria nel file (ennuple cons.) Indice B+-tree sull’attributo
ricerca nell’indice Indice di Hash sull’attributo
accesso diretto con la funzione di hashing
Progettazione Fisica e Tuning >> Concetti Avanzati >> Ottimizzazione
20G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Esecuzione di un Join Strategia elementare
cicli nidificatiabbastanza inefficiente
Esempio: S JOIN D ON S.codice=D.rel.per ogni ennupla di S
per ogni ennupla di D– se S.codice=D.relatore allora produci una
ennupla del risultato
Progettazione Fisica e Tuning >> Concetti Avanzati >> Ottimizzazione
21G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Esecuzione di un Join Cicli nidificati con indice
sfrutto un indice su uno degli attributi di join Esempio: S JOIN D ON S.relatore=D.cod
supponiamo di avere un indice su D.codiceper ogni ennupla di S
per ogni ennupla di D tale che D.cod=S.relatore– produci una ennupla del risultato
Progettazione Fisica e Tuning >> Concetti Avanzati >> Ottimizzazione
accesso basato sull’indice
22G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Esecuzione di un Join “Sort-Merge” Join
idea: se entrambe le tabelle sono ordinate sull’attributo di join, il join è lineare
Strategiacreo una copia ordinata delle tabellegenero il risultato per scansione lineareparticolarmente efficiente se una delle
tabelle è già ordinata
Progettazione Fisica e Tuning >> Concetti Avanzati >> Ottimizzazione
23G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Esecuzione di un Join Hash Join
idea: hash sull’attributo di join per entrambe le tabelle
Strategiacostruisco in memoria centrale una tabella di
hash per entrambe le tabelle sull’attr. di joinscandisco una tabella e per ciascun valore
uso la funzione di hash per localizzare i bucket di ennuple corrispondenti
Progettazione Fisica e Tuning >> Concetti Avanzati >> Ottimizzazione
24G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Piano C Supponiamo che:
non ci siano indici rilevanti
Selezioniscansione lineare
Joinsort-merge
Piano completo
Progettazione Fisica e Tuning >> Concetti Avanzati >> Ottimizzazione
S D
S.ciclo= ‘laurea sp.’
S.nome, S.cognome
D.codice=S.relatore
Piano C
D.cognome =‘Vieri’
25G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Piano D Supponiamo che:
indice di hash sul nome docente
indice di hash sul relatore
Selezionehash
Joincicli con indice
Progettazione Fisica e Tuning >> Concetti Avanzati >> Ottimizzazione
S
S.ciclo=‘laurea sp.’
S.nome, S.cognome
D
D.codice=S.relatore
Piano D
D.cognome =‘Vieri’
26G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Piano D Completo
Progettazione Fisica e Tuning >> Concetti Avanzati >> Ottimizzazione
Calcolata usando l’indicedi hash (non ènecessaria la materializzazione)
Ciclo nidificato con indice(uso l’indice secondariosu S.relatore)
Calcolata al volosul risultato del Join
S
S.ciclo=‘laurea sp.’
S.nome, S.cognome
D
D.codice=S.relatore
Piano D
D.cognome =‘Vieri’
27G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Piano C, Altra Ipotesi Supponiamo che:
indice di hash sul nome docente
indice secondario sul ciclo dello studente
Non molti benefici rispetto a Dil numero di valori di
ciclo è bassobassa selettività
dell’indice
Progettazione Fisica e Tuning >> Concetti Avanzati >> Ottimizzazione
S D
S.ciclo= ‘laurea sp.’
S.nome, S.cognome
D.codice=S.relatore
Piano C
D.cognome =‘Vieri’
28G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Ottimizzazione Tutti i DBMS di fascia alta consentono di
consultare i piani di esecuzione scelti Comando EXPLAIN
sintassi tipica: EXPLAIN <select>illustra il piano di esecuzione e fornisce la
stima di costo da parte dell’ottimizzatoreutilizzabile sia con PgSQL che con MySQL
Progettazione Fisica e Tuning >> Concetti Avanzati >> Ottimizzazione
29G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Messa a Punto (“Tuning”) Scenario tipico
dopo una fase iniziale, la base di dati viene sottoposta a valutazione delle prestazioni
le prestazioni sono inadeguateè necessario intervenire per migliorare le
prestazioni mettendo a punto i parametri Punto di partenza
carico applicativo
Progettazione Fisica e Tuning >> Concetti Avanzati >> Tuning
30G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Carico Applicativo (“Workload”) La messa a punto non è possibile per
tutte le possibili interrogazioni Si considerano le operazioni più frequenti
e rilevanti Carico applicativo
lista di interrogazionilista di aggiornamentiprestazioni attese per ciascuna (es: <2s,
oppure numero di transazioni al minuto)
Progettazione Fisica e Tuning >> Concetti Avanzati >> Tuning
31G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Attività del Tuning Scelta delle strutture di accesso
organizzazione dei file, indici, clustering Interventi sulle operazioni
riscritture, livelli di isolamento Interventi sullo schema logico
partizionamenti, aggregazioni, denormalizzazioni Interventi sui parametri architetturali
buffer, dischi, RAM
Progettazione Fisica e Tuning >> Concetti Avanzati >> Tuning
32G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Strutture di Accesso Principale forma di intervento
aggiunta di indici Attenzione
gli indici migliorano le prestazioni ma rallentano gli aggiornamentirichiedono spazio su discoè necessario un compromesso
Progettazione Fisica e Tuning >> Concetti Avanzati >> Tuning
33G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Strutture di Accesso Il caso estremo: base di dati di sola lettura Esempio (Shasha, “Database Tuning”)
il sistema informativo di Ellis Islandarchivio degli immigrati in USA tra l’800 e i
primi del 900 (milioni di ennuple)ricerche per cognome, nome e anno di arrivo
E’ possibile utilizzare molti indicicognome, nome, anno, cognome e anno,
cognome e nome
Progettazione Fisica e Tuning >> Concetti Avanzati >> Tuning
34G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Strutture di Accesso Linea guida n.1
è opportuno introdurre un indice solo se contribuisce a migliorare le prestazioni di più di una interrogazione del carico applicativo
Attenzione: non sempre l’ottim. riesce ad usare un indicees: select * from Impiegato
where stipendioAnnuo/12>3000verificare il piano di esecuzione prima e dopo
Progettazione Fisica e Tuning >> Concetti Avanzati >> Tuning
35G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Strutture di Accesso Linea guida n.2
gli attributi su cui intervenire sono quelli che compaiono in join e selezioni
per condizioni di uguaglianza (es: stipendio=5000) sono da preferirsi indici hash
per condizioni su intervalli (es: stipendio>5000 and stipendio <10000) sono da preferirsi B+-tree
Progettazione Fisica e Tuning >> Concetti Avanzati >> Tuning
36G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Strutture di Accesso Linea guida n.3
è opportuno introdurre un indice solo se il numero di valori dell’attributo è sufficientemente alto
Esempio:select * from impiegati
where stipendio = 10000l’indice su stipendio potrebbe non servire se
sono molti ad avere uno stipendio uguale
Progettazione Fisica e Tuning >> Concetti Avanzati >> Tuning
37G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Strutture di Accesso Linea guida n.4
attenzione ai colli di bottiglia Esempio n.1:
relazione disordinata con inserimenti frequenti
l’ultimo blocco è un collo di bottiglia Esempio n.2:
modifiche allo schema (lock in scrittura sul catalogo)
Progettazione Fisica e Tuning >> Concetti Avanzati >> Tuning
38G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Interventi sulle Operazioni Due forme
riscrittura delle operazioniscelta del livello di isolamento per le trans.
Esempio:select * from Impiegato
where stipendioAnnuo/12>3000select * from Impiegato
where stipendioAnnuo>3000*12
Progettazione Fisica e Tuning >> Concetti Avanzati >> Tuning
39G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Interventi sulle Operazioni Altre forme di riscrittura
limitare l’uso di nidificazione (difficilmente ottimizzabile)
Livello di isolamentoil livello standard è SERIALIZABLEin molti casi READ COMMITTED è adeguatoin generale, è opportuno separare
interrogazioni interattive e aggiornamenti
Progettazione Fisica e Tuning >> Concetti Avanzati >> Tuning
40G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Modifiche allo Schema Logico Non è detto che lo schema normalizzato
sia il più efficiente Quattro forme di intervento principali
partizionamenti di tabelleaggregazioni di tabelledenormalizzazione di tabelleaggiunta di informazione ridondante
Progettazione Fisica e Tuning >> Concetti Avanzati >> Tuning
41G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Modifiche allo Schema Logico Attenzione
modificare lo schema logico impedisce alle applicazioni di lavorare correttamente
Due possibili soluzionile modifiche allo schema logico vanno
decise molto presto (subito dopo la progettazione logica)
oppure, se è possibile, si crea uno schema esterno uguale al vecchio schema logico
Progettazione Fisica e Tuning >> Concetti Avanzati >> Tuning
42G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Modifiche allo Schema Logico Partizionamenti di tabelle
tabelle con molti attributi possono essere spezzate in due
Esempio: la tabella “Studente”chiave primaria (matricola)attributi anagrafici (nome, cognome, codice
fiscale, indirizzo, reddito del padre ecc.)attributi accademici (ciclo, anno di corso,
relatore, tirocinio, tutor ecc.)
Progettazione Fisica e Tuning >> Concetti Avanzati >> Tuning
43G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Modifiche allo Schema Logico Posso dividere la tabella in due tabelle
DatiAnagraficiStudente: matricola e tutti gli attributi anagrafici
DatiUniversitariStudente: matricola e tutti gli attributi universitari
Conviene sele operazioni richiedono di accedere
raramente a tutti i datiin questo caso è necessario un join
Progettazione Fisica e Tuning >> Concetti Avanzati >> Tuning
44G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Modifiche allo Schema Logico Attenzione
questo è un esempio di ristrutturazione dello schema che deve essere effettuato molto presto
le viste non servonodefinire la vista “Studente” corrispondente al
join delle tabelle partizionate non darebbe nessun beneficio in termini di prestazioni
Progettazione Fisica e Tuning >> Concetti Avanzati >> Tuning
45G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Modifiche allo Schema Logico Aggregazioni di tabelle
può essere utile per evitare join Esempio: Studente e Tirocinio
chiave esterna “matricola” di tirociniose l’accesso ai dati del tirocinio è frequente,
conviene riunirli in un’unica tabellasi evitano i joinaumentano i valori nulliposso definire due viste per pres. lo schema
Progettazione Fisica e Tuning >> Concetti Avanzati >> Tuning
46G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Modifiche allo Schema Logico Denormalizzazioni di tabelle
la normalizzazione evita le anomalie ma spesso costringe a fare troppi join
Esempio: Docente e NumeriNumeri(numero, docente FK)se devo frequentemente stampare l’elenco di
nomi e numeri posso aggiungendo il nome del docente alla tabella Numeri
aumenta la complessità degli aggiornamenti
Progettazione Fisica e Tuning >> Concetti Avanzati >> Tuning
47G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Modifiche allo Schema Logico In questo caso
si generano (modeste) anomalie di aggiornamento
esempio: ogni volta che cambio il cognome di un docente devo intervenire tanto su Docente che su Numeri
per evitare di creare istanze inconsistenti della base di dati è necessario utilizzare transazioni
Progettazione Fisica e Tuning >> Concetti Avanzati >> Tuning
48G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Modifiche allo Schema Logico Aggiunta di informazione ridondante
in alcuni casi può evitare interrogazioni complesse
Esempio: numero di esami sostenuti derivabile per aggregazione dal join di
studenti ed esamipuò essere memorizzato esplicitamente
come attributo di Studentecostringe ad utilizzare le transazioni
Progettazione Fisica e Tuning >> Concetti Avanzati >> Tuning
49G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Parametri Architetturali Buffer
aumentare il buffer aumenta l’”hit ratio”non è opportuno andare oltre un certo limite
Dischidisporre i file su più dischi aumenta le
prestazionies: disco per il log (il log è un tipico collo di
bottiglia)
Progettazione Fisica e Tuning >> Concetti Avanzati >> Tuning
50G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Concetti Avanzati Introduzione Ottimizzazione delle Interrogazioni
Un Esempio Messa a Punto (“Tuning”)
Carico ApplicativoStrutture di AccessoModifiche allo Schema LogicoParametri Architetturali
Progettazione Fisica e Tuning >> Sommario
51G. Mecca - [email protected] - Basi di DatiG. Mecca - [email protected] - Basi di Dati
Termini della Licenza
Termini della Licenza
This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/1.0/ or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
Questo lavoro viene concesso in uso secondo i termini della licenza “Attribution-ShareAlike” di Creative Commons. Per ottenere una copia della licenza, è possibile visitare http://creativecommons.org/licenses/by-sa/1.0/ oppure inviare una lettera all’indirizzo Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.