Condividi tramite


Progettazione di viste partizionate distribuite

Quando si progetta un set di viste partizionate distribuite per implementare una federazione di server di database, considerare le operazioni seguenti:

  • Determinare il modello di istruzioni SQL eseguite dall'applicazione.

  • Determinare la relazione esistente tra le tabelle.

  • Confrontare la frequenza delle istruzioni SQL con le partizioni definite in base all'analisi delle chiavi esterne.

  • Definire le regole di routing delle istruzioni SQL.

Modello di istruzioni SQL eseguite dall'applicazione

Compilare un elenco delle istruzioni SQL che verranno eseguite dall'applicazione durante i normali periodi di elaborazione. Dividere l'elenco nelle categorie SELECT, UPDATE, INSERT e DELETE e ordinare l'elenco relativo a ogni categoria in base alla frequenza di esecuzione. Se le istruzioni SQL fanno riferimento a stored procedure, utilizzare le istruzioni SELECT, INSERT, UPDATE e DELETE di base della stored procedure. Se si esegue il partizionamento di un database di SQL Server esistente, è possibile utilizzare SQL Server Profiler per ottenere tale elenco.

Per determinare la frequenza delle istruzioni SQL, è consigliabile attenersi approssimativamente alle statistiche relative a un database standard di un sito Web o OLTP, in cui le viste partizionate distribuite producono i risultati migliori. Questi sistemi sono caratterizzati dalla presenza di singole istruzioni SQL che recuperano quantità di dati relativamente ridotte rispetto ai tipi di query di un sistema di supporto decisionale, o OLAP. Se ogni istruzione SQL fa riferimento a una quantità ridotta di dati, è sufficiente analizzarne la frequenza per ottenere una buona approssimazione del traffico di dati all'interno del sistema. In molti sistemi, tuttavia, vi sono alcuni gruppi di istruzioni SQL che fanno riferimento a ingenti quantità di dati. In questi casi, può essere necessario valutare anche le query di questo tipo per adeguare il sistema ai requisiti derivanti dalla maggiore quantità di dati da gestire.

Relazioni tra le tabelle

Lo scopo consiste nell'individuare cluster di tabelle che possono essere partizionate lungo la stessa dimensione (ad esempio numero di parte o di reparto), in modo che tutte le righe correlate a singole occorrenze di tale dimensione vengano convogliate nello stesso server membro. Può risultare, ad esempio, che il modo migliore per partizionare un database sia in base all'area geografica. A tale scopo, anche le tabelle che non includono il numero dell'area nella rispettiva chiave devono poter essere partizionate in relazione a un'area. In un database di questo tipo, anche quando la tabella Customer non include una colonna relativa al numero dell'area, se le aree sono definite come insieme di stati o province, è possibile utilizzare la colonna Customer.StateProvince per eseguire il partizionamento dei clienti in relazione all'area.

Poiché definiscono le relazioni tra le tabelle, le chiavi esterne esplicite e implicite rappresentano i principali elementi in base ai quali determinare la modalità di partizionamento dei dati. Esaminare le definizioni di chiavi esterne esplicite per determinare in che modo le query utilizzano normalmente le righe di una tabella per trovare le righe corrispondenti di un'altra tabella. Analizzare inoltre le chiavi esterne implicite, ovvero i modi in cui le istruzioni SQL utilizzano i valori delle righe di una tabella per fare riferimento alle righe di un'altra tabella nell'ambito di operazioni di join, anche in assenza di una chiave esterna esplicita. Poiché le chiavi esterne implicite non vengono definite esplicitamente nell'ambito dello schema di database, è necessario esaminare le istruzioni SQL generate dall'applicazione per determinare se ve ne siano alcune che uniscono le tabelle in join utilizzando colonne non appartenenti alle chiavi. Tali chiavi esterne implicite vengono in genere indicizzate per migliorare le prestazioni dei join. È pertanto consigliabile esaminare anche gli indici definiti nel database.

Frequenza delle istruzioni SQL rispetto alle partizioni

Confrontare la frequenza delle istruzioni SQL con le partizioni definite in base all'analisi delle chiavi esterne. Selezionare la modalità di partizionamento più adatta alla combinazione di istruzioni SQL dell'applicazione in uso. Se alcuni set di tabelle possono essere partizionati in più modi, basarsi sulla frequenza delle istruzioni SQL per determinare quali partizioni soddisfano il maggior numero di istruzioni. È necessario partizionare per prime le tabelle a cui le istruzioni SQL fanno riferimento con maggiore frequenza. Assegnare un ordine di priorità alla sequenza di partizionamento delle tabelle in base alla frequenza dei riferimenti alle tabelle stesse.

La tipologia di istruzioni SQL influisce anche sulla decisione di eseguire o meno il partizionamento di una tabella:

  • Eseguire il partizionamento di una tabella se più del 5% delle istruzioni che vi fanno riferimento sono istruzioni INSERT, UPDATE o DELETE e se la tabella può essere partizionata lungo la dimensione selezionata.

  • Mantenere copie complete delle tabelle in ogni server membro se le istruzioni INSERT, UPDATE o DELETE che fanno riferimento a tali tabelle sono meno del 5%. È inoltre necessario definire le modalità di esecuzione degli aggiornamenti affinché tutte le copie della tabella siano aggiornate. Se è necessario un elevato livello di integrità delle transazioni, è possibile codificare trigger che eseguano aggiornamenti distribuiti di tutte le copie nel contesto di una transazione distribuita. Se non è necessario un livello elevato di integrità delle transazioni, è possibile utilizzare uno dei meccanismi di replica di SQL Server per propagare gli aggiornamenti da una copia della tabella a tutte le altre copie.

  • Evitare di eseguire il partizionamento o la copia di una tabella se più del 5% delle istruzioni che vi fanno riferimento sono istruzioni INSERT, UPDATE o DELETE e se la tabella non può essere partizionata lungo la dimensione selezionata.

Regole di routing delle istruzioni SQL

Le regole di routing devono individuare il server membro in grado di elaborare con la massima efficienza ogni istruzione SQL. Tali regole devono stabilire una relazione tra il contesto dell'input dell'utente e il server membro che include la maggior parte dei dati necessari per completare l'istruzione. Le applicazioni devono essere in grado di confrontare i dati immessi dall'utente con le regole di distribuzione per determinare quale server membro dovrà elaborare l'istruzione SQL.