Partizionamento di SQL Server: cosa utilizzare per la chiave di partizione?


10

Non ho mai lavorato con il partizionamento di SQL Server, ma attualmente mi trovo ad affrontare la progettazione di un database per il quale probabilmente i volumi lo giustificano. Il sistema è per coupon. I coupon devono essere emessi periodicamente, di solito ogni sei settimane anche se ci sarà anche un'emissione ad hoc, ad esempio per un evento speciale. Ci sono 15 milioni di clienti e per ogni evento di emissione, ogni cliente riceverà 6 diversi tipi di coupon, per un totale di 90 milioni di istanze di coupon. Dobbiamo tenere traccia dei dati di riscatto dell'istanza del coupon e mantenerli per 6 mesi, sebbene in genere un coupon sia valido solo per sei settimane. Qualsiasi richiesta di rimborso per un coupon non valido non raggiungerà il database poiché sarà convalidato dal POS fino al.

Per un periodo di sei mesi dovremo archiviare fino a 360 milioni di righe nella tabella Istanza coupon e fino a 72 milioni (presupponendo un tasso di rimborso massimo del 20%) nella tabella di rimborso. Ho la sensazione che questi numeri siano troppo grandi per una singola partizione?

La mia domanda è: cosa usare come chiave di partizione? Un candidato ovvio sarebbe per evento di emissione, dando circa 6 partizioni. Ma poi penso che forse anche questo darebbe una dimensione della partizione troppo grande per consentire prestazioni ottimali? Sarebbe possibile partizionare con due chiavi, ad es. Per evento di emissione + ultima cifra dell'ID cliente? Quindi la logica sarebbe:

If issuance event = 1 and last digit of customer id < 5 then
    Store in partition 1
Else if issuance event = 1 and last digit of customer id >4 then
    Store in partition 2
Else if issuance event =2 and last digit of customer id <5 then
    Store in partition 3
Else if issuance event =2 and last digit of customer id >4 then
    Store in partition 4
Etc...

Inoltre, non sono sicuro delle specifiche del server di database di cui avremo bisogno. Saranno sufficienti 16 GB e 8 PC? Il db deve essere in grado di restituire un risultato dalla tabella dell'istanza del coupon, digitata su un valore di codice a barre numerico in meno di mezzo secondo. La richiesta di transazione prevista per convalidare (selezionare) e riscattare (inserire) dovrebbe raggiungere il picco a circa 3.500 al minuto.

Il server db a 64 bit di SQL Server 2008r2 verrà eseguito il provisioning come VM da un host molto potente con accesso a una SAN ad alte prestazioni e di grande capacità.

Sarei molto grato per qualsiasi consiglio da parte di coloro che hanno implementato una soluzione SQL Server per gestire volumi simili.

Saluti

Rapinare.


2
Le tue tabelle sono ancora piccole - nessuna ESIGENZA per le partizioni, ho una tabella con un paio di miliardi di righe senza partizione, funziona. Le partizioni sono belle per FAST DROP, però.
TomTom,

1
Nonsense @TomTom, le partizioni possono essere utili ai conteggi delle righe una frazione di questo. Concesso lo schema di partizione deve essere di beneficio ai modelli di accesso per realizzare un guadagno in termini di prestazioni, ma una coperta "no NEED" a queste dimensioni è chiaramente sbagliata.
Mark Storey-Smith,

1
No, è corretto. BISOGNO! = Vantaggio. Il BISOGNO è quando si verificano problemi durante l'esecuzione di query senza partizioni.
TomTom,

1
Hey @TomTom Penso che tu abbia bisogno di un piccolo compagno di pausa, è un po 'forte, anche se in realtà non offensivo. Concordo con Mark StoreySmith, una coperta "senza BISOGNO" è chiaramente sbagliata, tuttavia la tua affermazione che probabilmente non è necessaria è corretta. Immagino sia una questione di indicizzazione. So anche che Mark sa cosa intendi per bisogno vs beneficio. Riducici un po 'e lascia perdere la caffeina, k? (E credetemi, è noto che ho pochissima pazienza alcuni giorni, specialmente giorni come oggi in cui sono in terapia antidolorifica per la mia schiena)
jcolebrand

Risposte:


14

Le domande sulle specifiche del server devono essere indirizzate a Serverfault o DBA.SE.

Per la domanda sul partizionamento, non penso che sia necessario partizionare per questo.

Le file a 360m sono molte ma non troppo ingombranti.

Non NON in nessun caso cercare di partizione di base l'ultima cifra di un campo. Non sono sicuro che funzionerebbe, ma non è SARGable che non sarebbe sostenibile.

Se devi solo cercare una singola riga in base a un tasto numerico, probabilmente il partizionamento non sarà di aiuto.

Se decidi di seguire il percorso della partizione, tieni presente che per essere efficace tutte le tue query devono includere le chiavi della partizione in modo che il motore sappia quale partizione controllare. Altrimenti li controllerà tutti e in realtà danneggierai le prestazioni.



Concordo anche io. A volte hai solo bisogno di indici migliori.
jcolebrand

Non sono d'accordo @JNK. Una ricerca a riga singola basata su un tasto numerico che beneficia dell'eliminazione della partizione sta riducendo l'IO. Se i modelli di accesso sono tali che le partizioni a cui si accede frequentemente rimangono nel pool buffer rispetto alle partizioni a cui si accede raramente, si ottengono ulteriori vantaggi in termini di prestazioni. E non abbiamo nemmeno toccato la mia funzione preferita che il partizionamento ti offre, parziale disponibilità.
Mark Storey-Smith,

Per la cronaca, sugli altri punti concordo con tutto il cuore :)
Mark Storey-Smith,

@ MarkStorey-Smith - Dipenderà dalla sua chiave. Come attualmente definito nell'OP, la partizione non aggiungerebbe alcun valore. Sembra anche che non sarà in grado di usare una chiave in due parti con un campo data o uno schema di partizione "normale".
JNK,

5

È possibile partizionare su più chiavi se si utilizza una colonna calcolata persistente; come altri hanno detto, tuttavia, il partizionamento non funziona per ogni situazione. Non sono sicuro di aver capito abbastanza il tuo scenario per darti consigli specifici, ma ecco alcune linee guida generali:

  • Il partizionamento è utile nella lettura dei dati quando la chiave di partizionamento fa parte dell'istruzione SQL, che consente all'ottimizzatore di invocare l'esclusione delle partizioni. Devi essere sicuro che la chiave scelta sia utile per la maggior parte delle query.

  • Uno dei vantaggi di una buona strategia di partizionamento è l'invecchiamento dei dati; ad esempio, se la chiave di partizione è basata sulla data (ad esempio, il giorno dell'anno) e si desidera rimuovere tutti i dati più vecchi di una determinata data, è molto facile COMMUTARE quelle partizioni su una tabella vuota e troncarle.


4

Devi davvero definire le tue esigenze in modo un po 'più chiaro. Dici che avrai circa 360 milioni di file in 6 mesi. Che ne dici di 2 anni? Crescerai ancora solo al ritmo che stai attualmente crescendo. O c'è la possibilità che tu possa sperimentare una crescita esponenziale. Vuoi conservare i dati in questa tabella per sempre; o vorresti archiviare i dati su base regolare.

Il partizionamento può essere utilizzato per l'archiviazione dei dati. Vedi lo scenario della finestra scorrevole. Vedi questo white paper e questo .

Il partizionamento può anche essere usato per gestire la frammentazione dell'indice. È possibile ricostruire / riorganizzare partizioni particolari.

È inoltre necessario considerare le viste partizionate anziché le tabelle partizionate. Le viste partizionate non richiedono la licenza di SQL Server Enterprise. Le viste partizionate consentono inoltre di eseguire ricostruzioni di indici online su una particolare "partizione".

Il partizionamento può essere preso in considerazione anche durante la pianificazione del ripristino di emergenza. Può essere utilizzato per il recupero parziale del database. Ad esempio: puoi avere le tue vecchie partizioni in un filegroup diverso rispetto alle partizioni principali / correnti. E poi quando si esegue il ripristino, si ripristina il filegroup primario, quindi il filegroup su cui risiedono le partizioni correnti e infine è possibile ripristinare i filegroup su cui risiedono le partizioni precedenti. Ciò può ridurre il tempo di inattività dell'applicazione.

Guarda questo fantastico video di Kimberly Tripp sul partizionamento .


Dobbiamo solo conservare i dati per sei mesi. Ogni settimana avremmo eseguito un lavoro di pulizia che avrebbe eliminato eventuali coupon emessi più di sei mesi prima.
Rob Bowman,

3
Quindi in pratica dovresti eliminare / rimuovere circa 15 milioni di righe ogni settimana. Quanto è largo il tavolo? Vorrei suggerire di dividere la tabella per colonna data. In questo modo le eliminazioni settimanali sarebbero una semplice meta operazione. Devi semplicemente COMMUTARE la partizione più vecchia dalla tabella partizionata principale in una tabella di gestione temporanea. Quindi rilasciare la tabella di gestione temporanea. Questo si chiama scenario Windows scorrevole. Cerca il primo white paper che ho pubblicato oh come fare.
Dharmendar Kumar "DK",

-2

A meno che non si esegua il partizionamento a causa dell'archiviazione di vecchi dati, lo si sta facendo per la ragione sbagliata e non si dovrebbe farlo.


2
Ci sono molte ragioni per usare il partizionamento oltre all'archiviazione; l'esclusione delle partizioni è di grande beneficio per molti diversi tipi di query, se utilizzate correttamente.
Stuart Ainsworth,

Sono d'accordo con Stuart, questo è un consiglio piuttosto negativo.
jcolebrand
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.