Descrivere gli oggetti di database
Oltre alle tabelle, un database relazionale può contenere altre strutture che consentono di ottimizzare l'organizzazione dei dati, incapsulare le azioni programmatiche e migliorare la velocità di accesso. In questa unità vengono fornite informazioni più dettagliate su tre di queste strutture: viste, stored procedure e indici.
Che cos'è una visualizzazione?
Una vista è una tabella virtuale basata sul set di risultati di una query SELECT. È possibile considerare una vista come una finestra sulle righe specificate in una o più tabelle sottostanti. È ad esempio possibile creare una vista nelle tabelle Order e Customer che recuperano i dati degli ordini e dei clienti per fornire un singolo oggetto che semplifica la determinazione degli indirizzi di consegna per gli ordini:
CREATE VIEW Deliveries
AS
SELECT o.OrderNo, o.OrderDate,
c.FirstName, c.LastName, c.Address, c.City
FROM Order AS o JOIN Customer AS c
ON o.Customer = c.ID;
È possibile eseguire una query sulla visualizzazione e filtrare i dati allo stesso modo di una tabella. La query seguente trova i dettagli degli ordini per i clienti che risiedono a Seattle:
SELECT OrderNo, OrderDate, LastName, Address
FROM Deliveries
WHERE City = 'Seattle';
Che cos'è una stored procedure?
Una stored procedure definisce istruzioni SQL che possono essere eseguite su comando. Le stored procedure vengono usate per incapsulare la logica programmatica in un database per le azioni che le applicazioni devono eseguire quando si usano i dati.
È possibile definire una stored procedure con parametri per creare una soluzione flessibile per azioni comuni che potrebbe essere necessario applicare ai dati in base a una chiave o a criteri specifici. È ad esempio possibile definire la stored procedure seguente per modificare il nome di un prodotto in base all'ID prodotto specificato.
CREATE PROCEDURE RenameProduct
@ProductID INT,
@NewName VARCHAR(20)
AS
UPDATE Product
SET Name = @NewName
WHERE ID = @ProductID;
Quando un prodotto deve essere rinominato, è possibile eseguire la stored procedure, passando l'ID del prodotto e il nuovo nome da assegnare:
EXEC RenameProduct 201, 'Spanner';
Che cos'è un indice?
Un indice consente di cercare i dati in una tabella. Un indice di una tabella è paragonabile all'indice riportato nelle ultime pagine di un libro. L'indice di un libro contiene un set ordinato di riferimenti, con l'indicazione della pagina in cui si trova ogni riferimento. Quando si vuole trovare un riferimento a un elemento contenuto nel libro, è possibile cercarlo attraverso l'indice. È quindi possibile usare i numeri di pagina nell'indice per passare direttamente alle pagine appropriate. Senza un indice, potrebbe essere necessario leggere l'intero libro per trovare i riferimenti che si stanno cercando.
Quando si crea un indice in un database, si specifica una colonna della tabella e l'indice contiene una copia di questi dati disposti in ordine, con puntatori alle righe corrispondenti nella tabella. Quando l'utente esegue una query che specifica questa colonna nella clausola WHERE, il sistema di gestione di database può usare l'indice per recuperare i dati più rapidamente rispetto a quando doveva analizzare l'intera tabella riga per riga.
È ad esempio possibile usare il codice seguente per creare un indice nella colonna Name della tabella Product:
CREATE INDEX idx_ProductName
ON Product(Name);
L'indice crea una struttura basata su albero che lo strumento Query Optimizer del sistema di database può usare per trovare rapidamente righe nella tabella Product in base a un valore Name specificato.
Per una tabella contenente poche righe, l'uso dell'indice non è probabilmente più efficiente rispetto alla semplice lettura dell'intera tabella e alla ricerca delle righe richieste dalla query. In tale caso, Query Optimizer ignorerà l'indice. Quando una tabella ha molte righe, tuttavia, gli indici possono migliorare notevolmente le prestazioni delle query.
In una tabella è possibile creare molti indici. Se si vuole anche trovare prodotti in base al prezzo, quindi, la creazione di un altro indice nella colonna Price nella tabella Product potrebbe essere utile. Gli indici comportano tuttavia un costo. Un indice utilizza spazio di archiviazione e ogni volta che si inseriscono, aggiornano o eliminano dati in una tabella, gli indici di tale tabella richiedono un'attività di gestione. Questo lavoro aggiuntivo può rallentare le operazioni di inserimento, aggiornamento ed eliminazione. È necessario trovare un equilibrio tra l'uso di indici per velocizzare le query e il costo dell'esecuzione di altre operazioni.