Condividi tramite


Creazione di viste partizionate distribuite

Prima di implementare una vista partizionata, è necessario partizionare una tabella orizzontalmente. Per progettare uno schema di partizionamento, è necessario innanzitutto definire quali dati appartengono a ogni tabella membro. La tabella originale viene sostituita da numerose tabelle membro di dimensioni minori. Ogni tabella membro contiene lo stesso numero di colonne della tabella originale e ogni colonna ha gli stessi attributi della colonna corrispondente della tabella originale, ad esempio il tipo di dati, le dimensioni e le regole di confronto. Se si desidera creare una vista partizionata distribuita, ogni tabella membro si trova in un server membro distinto. Per una maggiore trasparenza a livello di posizione, è consigliabile adottare nomi dei database membri uguali in ogni server membro, benché ciò non sia strettamente necessario. Ad esempio, specificare Server1.CustomerDB, Server2.CustomerDB, Server3.CustomerDB.

Creazione delle tabelle membro

Progettare le tabelle membro in modo tale che in ognuna di esse sia archiviata una sezione orizzontale della tabella originale basata su un intervallo di valori chiave. Gli intervalli sono basati sui valori di una colonna di partizionamento. L'intervallo di valori di ogni tabella membro è imposto da un vincolo CHECK nella colonna di partizionamento e gli intervalli non possono essere sovrapposti. Ad esempio, non può esistere una tabella con un intervallo compreso tra 1 e 200000 e un'altra tabella con un intervallo compreso tra 150000 e 300000, perché non sarebbe chiaro quale tabella contiene i valori compresi tra 150000 e 200000.

Ad esempio, si supponga di partizionare una tabella Customer in tre tabelle. Il vincolo CHECK per queste tabelle è il seguente:

-- On Server1:
CREATE TABLE Customers_33
  (CustomerID   INTEGER PRIMARY KEY
                CHECK (CustomerID BETWEEN 1 AND 32999),
  ... -- Additional column definitions)

-- On Server2:
CREATE TABLE Customers_66
  (CustomerID   INTEGER PRIMARY KEY
                CHECK (CustomerID BETWEEN 33000 AND 65999),
  ... -- Additional column definitions)

-- On Server3:
CREATE TABLE Customers_99
  (CustomerID   INTEGER PRIMARY KEY
                CHECK (CustomerID BETWEEN 66000 AND 99999),
  ... -- Additional column definitions)

Definizione delle viste partizionate distribuite

Dopo aver creato le tabelle membro, è possibile definire una vista partizionata distribuita in ogni server membro, assegnando a ogni vista lo stesso nome. In questo modo, è possibile eseguire le query che fanno riferimento al nome della vista partizionata distribuita in uno o più server membri. Il sistema opera come se in ogni server membro fosse presente una copia della tabella originale, mentre in ogni server è presente solo una tabella membro e una vista partizionata distribuita. La posizione dei dati è visibile all'applicazione.

Per creare le viste partizionate distribuite, eseguire le operazioni seguenti:

  • Aggiungere le definizioni dei server collegati in ogni server membro contenente le informazioni di connessione necessarie per l'esecuzione di query distribuite negli altri server membri. Ciò consente a un vista partizionata distribuita di accedere ai dati negli altri server.

  • Impostare l'opzione lazy schema validation tramite sp_serveroption per ogni definizione di server collegato utilizzata nelle viste partizionate distribuite. Ciò consente di ottimizzare le prestazioni poiché Query Processor non richiederà metadati per le tabelle collegate fino a che i dati della tabella membro remota non saranno effettivamente necessari.

  • Creare una vista partizionata distribuita in ogni server membro. Le viste utilizzano istruzioni SELECT distribuite per accedere ai dati dei server membri collegati e uniscono le righe distribuite con le righe della tabella membro locale.

Per creare le viste partizionate distribuite per l'esempio precedente, è necessario effettuare le operazioni seguenti:

  • Aggiungere una definizione di server collegato denominata Server2 contenente le informazioni di connessione per Server2 e una definizione di server collegato denominata Server3 per l'accesso a Server3.

  • Creare la vista partizionata distribuita seguente:

    CREATE VIEW Customers AS
       SELECT * FROM CompanyDatabase.TableOwner.Customers_33
    UNION ALL
       SELECT * FROM Server2.CompanyDatabase.TableOwner.Customers_66
    UNION ALL
       SELECT * FROM Server3.CompanyDatabase.TableOwner.Customers_99
    
  • Eseguire gli stessi passaggi in Server2 e Server3.

Regole per le tabelle

Le tabelle membro sono definite nella clausola FROM di ogni istruzione SELECT nella definizione della vista. Ogni tabella membro deve essere conforme alle regole seguenti:

  • Nella vista non possono essere presenti più riferimenti alla stessa tabella membro.

  • Nelle colonne calcolate delle tabelle membro non possono essere creati indici.

  • Tutti i vincoli PRIMARY KEY delle tabelle membro devono riguardare lo stesso numero di colonne.

  • Alle tabelle membro deve essere associata la stessa impostazione ANSI Padding. Per ulteriori informazioni sull'impostazione ANSI Padding, vedere SET ANSI_PADDING.

Regole per le colonne

Le colonne sono definite nell'elenco di selezione di ogni istruzione SELECT nella definizione della vista. Ogni colonna deve essere conforme alle regole seguenti:

  • Tutte le colonne di ogni tabella membro devono essere incluse nell'elenco di selezione. SELECT * FROM <member table> è una sintassi valida.

  • Nell'elenco di selezione non possono essere presenti più riferimenti alla stessa colonna.

  • Le colonne devono occupare la stessa posizione ordinale nell'elenco di selezione.

  • Le colonne nell'elenco di selezione di ogni istruzione SELECT devono essere dello stesso tipo. Ciò include il tipo di dati, la precisione, la scala e le regole di confronto. Ad esempio, la definizione di vista seguente genera un errore perché la prima colonna di entrambe le istruzioni SELECT non contiene lo stesso tipo di dati:

    CREATE VIEW NonUpdatable
    AS
    SELECT IntPrimaryKey, IntPartNmbr
    FROM FirstTable
      UNION ALL
    SELECT NumericPrimaryKey, IntPartNmbr
    FROM SecondTable
    

Regole per la colonna di partizionamento

Per il partizionamento è possibile utilizzare una sola colonna, che deve essere presente in ogni tabella membro. I vincoli CHECK identificano i dati disponibili in ogni tabella membro. Sono valide le regole aggiuntive seguenti:

  • Gli intervalli di chiavi dei vincoli CHECK di ogni tabella non possono sovrapporsi agli intervalli di qualsiasi altra tabella. Ogni valore della colonna di partizionamento deve essere mappato a una sola tabella. I vincoli CHECK possono utilizzare unicamente gli operatori seguenti: BETWEEN, IN, AND, OR, <, <=, >, >=, =.

  • La colonna di partizionamento non può essere una colonna Identity, predefinita o timestamp.

  • La colonna di partizionamento deve occupare la stessa posizione ordinale nell'elenco di selezione di ogni istruzione SELECT nella vista. Ad esempio, la colonna di partizionamento è sempre la prima colonna in ogni elenco di selezione oppure la seconda colonna e così via.

  • Nella colonna di partizionamento non sono consentiti valori Null.

  • La colonna di partizionamento deve essere inclusa nella chiave primaria della tabella.

  • La colonna di partizionamento non può essere una colonna calcolata.

  • Nella colonna di partizionamento può essere presente un solo vincolo. Se sono presenti più vincoli, SQL Server li ignorerà e non li prenderà in considerazione quando deve stabilire se la vista è o meno una vista partizionata.

  • Non esistono restrizioni per l'aggiornabilità della colonna di partizionamento.

Le colonne di partizionamento conformi a tutte queste regole supportano tutte le ottimizzazioni fornite da Query Optimizer. Per ulteriori informazioni, vedere Risoluzione di viste partizionate distribuite.

Regole generali

Nota

Le condizioni seguenti non sono valide per le viste partizionate locali create nello stesso server. Questa funzionalità è inclusa per compatibilità con le versioni precedenti.

È consigliabile tenere presenti le regole aggiuntive seguenti:

  • Non è possibile creare una vista partizionata distribuita tramite gli operatori EXCEPT o INTERSECT.

  • Per assicurare l'atomicità in tutti i nodi da aggiornare, viene avviata una transazione distribuita.

  • L'opzione SET XACT_ABORT deve essere impostata su ON.

  • Le colonne smallmoney e smalldatetime delle tabelle remote vengono mappate rispettivamente come money e datetime. Le colonne corrispondenti delle tabelle locali saranno pertanto anch'esse money e datetime.

  • Un server collegato non può essere un server collegato loopback, ovvero un server collegato che punta alla stessa istanza di SQL Server.

Una vista che fa riferimento a tabelle partizionate senza essere conforme a tutte queste regole può comunque essere aggiornabile se contiene un trigger INSTEAD OF. È tuttavia possibile che i piani di esecuzione creati da Query Optimizer per una vista che contiene un trigger INSTEAD OF non siano sempre efficienti quanto i piani creati per una vista partizionata conforme a tutte le regole.