Utilizzo di viste partizionate

Data aggiornamento: 17 luglio 2006

Le viste partizionate consentono di suddividere i dati di tabelle di grandi dimensioni in più tabelle membro di dimensioni minori. I dati vengono partizionati tra le tabelle membro in base agli intervalli di valori di dati di una colonna specifica. Gli intervalli di dati per ogni tabella membro sono definiti in un vincolo CHECK definito nella colonna di partizionamento. Viene quindi definita una vista che utilizza UNION ALL per unire le istruzioni SELECT di tutte le tabelle membro in un unico set di risultati. Se nelle istruzioni SELECT che fanno riferimento alla vista viene specificata una condizione di ricerca per la colonna di partizione, Query Optimizer utilizza le definizioni del vincolo CHECK per determinare quale tabella membro include le righe.

[!NOTA] Il metodo consigliato per il partizionamento locale dei dati in un server prevede l'utilizzo di tabelle partizionate. Per ulteriori informazioni, vedere Tabelle e indici partizionati.

Ad esempio, la tabella in cui sono registrate le vendite relative al 1998 è stata partizionata in 12 tabelle membro, una per ogni mese. Per ogni tabella membro è stato quindi definito un vincolo nella colonna OrderMonth:

CREATE TABLE May1998sales
   (OrderID      INT,
   CustomerID      INT      NOT NULL,
   OrderDate      DATETIME      NULL
      CHECK (DATEPART(yy, OrderDate) = 1998),
   OrderMonth      INT
      CHECK (OrderMonth = 5),
   DeliveryDate      DATETIME      NULL
      CHECK(DATEPART(mm, DeliveryDate) = 5)
   CONSTRAINT OrderIDMonth PRIMARY KEY(OrderID, OrderMonth)
   )

L'applicazione che esegue il popolamento dei dati in May1998sales deve garantire che la colonna OrderMonth contenga il valore 5 in tutte le righe e che la data dell'ordine sia relativa al mese di maggio del 1998. A tale scopo vengono utilizzati i vincoli definiti nella tabella.

Viene quindi definita una vista che utilizza UNION ALL per selezionare i dati delle 12 tabelle membro come un unico set di risultati:

CREATE VIEW Year1998Sales
AS
SELECT * FROM Jan1998Sales
UNION ALL
SELECT * FROM Feb1998Sales
UNION ALL
SELECT * FROM Mar1998Sales
UNION ALL
SELECT * FROM Apr1998Sales
UNION ALL
SELECT * FROM May1998Sales
UNION ALL
SELECT * FROM Jun1998Sales
UNION ALL
SELECT * FROM Jul1998Sales
UNION ALL
SELECT * FROM Aug1998Sales
UNION ALL
SELECT * FROM Sep1998Sales
UNION ALL
SELECT * FROM Oct1998Sales
UNION ALL
SELECT * FROM Nov1998Sales
UNION ALL
SELECT * FROM Dec1998Sales

Ad esempio, l'istruzione SELECT seguente esegue query per il recupero delle informazioni relative a mesi specifici.

SELECT *
FROM Year1998Sales
WHERE OrderMonth IN (5,6) AND CustomerID = 64892

Query Optimizer di SQL Server rileva che la condizione di ricerca dell'istruzione SELECT fa riferimento solo alle righe delle tabelle May1998Sales e Jun1998Sales e pertanto limita la ricerca a tali tabelle.

Per l'esecuzione di aggiornamenti su una vista partizionata è necessario che la colonna di partizionamento faccia parte della chiave primaria della tabella di base. Se una vista non è aggiornabile è possibile creare sulla vista un trigger INSTEAD OF che consenta gli aggiornamenti. Si consiglia di progettare la gestione degli errori all'interno del trigger in modo da assicurare che non vengano inserite righe duplicate. Per un esempio di un trigger INSTEAD OF progettato su una vista, vedere Progettazione di trigger INSTEAD OF.

Per ottenere risultati corretti non è necessario applicare vincoli CHECK alla vista partizionata. Se tuttavia non vengono definiti vincoli CHECK, Query Optimizer deve eseguire la ricerca in tutte le tabelle anziché solo nelle tabelle che soddisfano la condizione di ricerca nella colonna di partizionamento. Se non è stato definito alcun vincolo CHECK, la vista funziona in base alle normali modalità previste per UNION ALL. Query Optimizer non è in grado di stabilire presupposti relativi ai valori archiviati in tabelle diverse e non può evitare la ricerca in tutte le tabelle incluse nella definizione della vista.

Se tutte le tabelle membro alle quali fa riferimento la vista partizionata si trovano nello stesso server, tale vista è considerata una vista partizionata locale. Se invece le tabelle membro si trovano in più server, la vista è considerata una vista partizionata distribuita. Le viste partizionate distribuite consentono di ripartire il carico di elaborazione del database di un sistema tra più server. Per ulteriori informazioni, vedere Federazione di server di database.

L'utilizzo di viste partizionate facilita la gestione indipendente delle tabelle membro. Ad esempio, alla fine di un periodo di tempo specifico è possibile eseguire le operazioni seguenti:

  • Modificare la definizione della vista partizionata per i risultati correnti aggiungendovi un nuovo periodo di tempo ed eliminando quello precedente.
  • Modificare la definizione della vista partizionata per i risultati passati aggiungendovi il periodo di tempo eliminato dalla vista dei risultati correnti. È inoltre possibile aggiornare la vista dei risultati passati per rimuovere e archiviare il periodo meno recente a cui si riferisce.

Quando si inseriscono dati in viste partizionate, è possibile utilizzare la stored procedure di sistema sp_executesql per creare istruzioni INSERT con piani di esecuzione con un'elevata probabilità di riutilizzo in sistemi con numerosi utenti simultanei.

Vedere anche

Concetti

Creazione di viste partizionate
Creazione di viste partizionate distribuite
Progettazione di applicazioni per l'utilizzo di federazioni di server di database

Altre risorse

ALTER VIEW (Transact-SQL)
SELECT (Transact-SQL)
CREATE VIEW (Transact-SQL)
sp_executesql (Transact-SQL)

Guida in linea e informazioni

Assistenza su SQL Server 2005

Cronologia modifiche

Versione Cronologia

17 luglio 2006

Contenuto modificato:
  • Eliminazione dell'affermazione per cui le viste partizionate locali sono incluse solo per garantire la compatibilità con le versioni precedenti e a breve risulteranno obsolete.