Condividi tramite


Utilizzo di viste partizionate

Le viste partizionate consentono di dividere 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 una colonna specifica. Gli intervalli di dati per ogni tabella membro sono definiti in un vincolo CHECK specificato 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 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 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 in quelle 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 prevedere i 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 una 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 database.

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

  • Modificare la definizione della vista partizionata per i risultati correnti aggiungendovi il periodo più recente ed eliminando quello precedente.

  • Modificare la definizione della vista partizionata per i risultati passati aggiungendovi il periodo appena 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.

[!NOTA]

L'importazione bulk in una vista partizionata non è supportata dal comando bcp o dalle istruzioni BULK INSERT e INSERT... SELECT * FROM OPENROWSET(BULK...). È tuttavia possibile inserire più righe in una vista partizionata utilizzando un'istruzione INSERT.