Database di SQL Server su un SSD: qualche vantaggio su un file separato per ogni tabella?


19

Sto creando un database in cui ci saranno circa 30 tabelle, con ogni tabella contenente decine di milioni di righe e ogni tabella contenente una singola colonna importante e una colonna chiave primaria / esterna al fine di massimizzare l'efficienza della query di fronte a pesanti aggiornamenti e inserimenti e fanno un uso pesante di indici cluster. Due delle tabelle conterranno dati testuali di lunghezza variabile, con una contenente centinaia di milioni di righe ma il resto conterrà solo dati numerici.

Dato che voglio davvero spremere fino all'ultima goccia di prestazioni dall'hardware che ho a disposizione (circa 64 GB di RAM, un SSD molto veloce e 16 core), stavo pensando di consentire a ogni tabella di avere il proprio file in modo che non importa se Mi unisco a 2, 3, 4, 5 o più tabelle, ogni tabella verrà sempre letta utilizzando un thread separato e la struttura di ciascun file sarà strettamente allineata con il contenuto della tabella, il che si spera minimizzerebbe la frammentazione e la renderebbe più veloce per SQL Server da aggiungere al contenuto di una determinata tabella.

Un avvertimento, sono bloccato su SQL Server 2008 R2 Web Edition . Ciò significa che non posso usare il partizionamento orizzontale automatico, che lo esclude come un miglioramento delle prestazioni.

L'uso di un file per tabella massimizzerà effettivamente le prestazioni o sto trascurando le caratteristiche integrate del motore SQL Server che renderebbero così ridondante?

In secondo luogo, se l'utilizzo di un file per tabella è vantaggioso, perché create tablemi dà solo la possibilità di allocare la tabella a un gruppo di file e non a un file logico specifico? Ciò richiederebbe di creare un gruppo di file separato per ogni file nel mio scenario, il che mi suggerisce che forse SQL Server non sta immaginando i vantaggi che presumo derivino dal fare ciò che sto proponendo.

Risposte:


18

Stavo pensando di consentire a ogni tabella di avere il proprio file in modo che, indipendentemente dal fatto che mi unisca a 2, 3, 4, 5 o più tabelle, ogni tabella verrà sempre letta utilizzando un thread separato e la struttura di ciascun file sarà essere strettamente allineato con il contenuto della tabella, il che si spera minimizzi la frammentazione e renderebbe più veloce l'aggiunta di SQL Server al contenuto di una determinata tabella

Di che diamine stai parlando? Non sei sicuro di dove hai ottenuto le tue informazioni, ma dovresti sicuramente scartare quella fonte. Nulla da ciò che supponi qui è effettivamente corretto.

Se vuoi leggere una buona discussione sulle prestazioni dell'SSD per SQL Server, ci sono diverse serie di blog là fuori. Come al solito, quello di Paul Randal è il migliore:

Brent ha anche una bella presentazione sull'argomento: SQL su SSD: Hot and Crazy Love e ce ne sono altri là fuori.

Passando attraverso tutte queste presentazioni, noterai rapidamente che si concentrano tutte sulle scritture poiché è qui che le prestazioni degli SSD entrano in scena. La tua formulazione post riguarda quasi interamente le letture, che è un argomento diverso. Se le letture sono il punto debole, allora dovresti parlare di RAM, non di SSD e di strategie di indicizzazione e query adeguate.


1
Sì, mi sono state fornite informazioni sbagliate da qualche parte lungo la linea ma, come ho commentato la risposta di Stuart, ho posto la domanda per assicurarmi di non basare le mie decisioni su informazioni errate. Grazie per i collegamenti, li controllerò.

17

Il mio primo suggerimento sarebbe di non fare ipotesi sulle prestazioni senza fare test di carico su entrambe le configurazioni.

La mia ipotesi dall'aver visto tali configurazioni (che hanno senso sulla carta) in passato sarebbe che avere ogni tabella su un file separato non avrebbe un impatto positivo misurabile per le prestazioni ... e che la complessità aggiuntiva compenserebbe qualsiasi aumento delle prestazioni anche se fossero misurabili.

Infine, quando si tratta di spremere ogni calo di prestazioni da un server SQL, vi rimando al seguente grafico (fornito dalla mia Microsoft):

inserisci qui la descrizione dell'immagine

Qualsiasi potenziale ottimizzazione che potrebbe essere apportata dal punto di vista dell'applicazione sminuisce facilmente ogni possibile ottimizzazione a livello di configurazione hardware / database ... quindi focalizza la tua attenzione in modo appropriato.


Ovviamente. Nel mio caso, tuttavia, ho ottimizzato l'intero sistema il più possibile e il principale collo di bottiglia che ho in questo momento è la velocità delle query molto elevata di fronte a frequenti aggiornamenti, eliminazioni e inserimenti. Poiché sto per sfruttare SQL Server per risolvere questo problema, voglio assicurarmi di offrirgli la migliore possibilità assoluta di operare il più velocemente possibile sui miei dati.

@NathanRidley Ok, ho capito ... Penso che la vera risposta a meno che qualcuno non abbia una risorsa che dice "non farlo mai", che il miglior modo di agire sarebbe quello di confrontare due configurazioni con il tuo carico di lavoro tipico e vedere se c'è una differenza misurabile.
Michael Fredrickson,

4

Come altri hanno notato, non vi è alcun vantaggio diretto da un file per tabella; ecco una grande sinossi di Steve Jones su come è nato questo mito: http://www.sqlservercentral.com/blogs/steve_jones/2009/10/13/sql-server-legend-data-files-and-threads/

Potresti anche voler esaminare una vista partizionata che credo sia supportata dalla 2008 Web Edition. Esistono alcuni trucchi per la codifica rispetto a una vista partizionata, ma è possibile simulare relativamente molte funzionalità delle tabelle partizionate.


2

Penso che file separati per ogni tabella non apporterebbero alcun vantaggio in termini di prestazioni. Gli indici corretti potrebbero avere una potenziale prestazione (lettura del disco) in maiuscolo sul server database.

SQL Server 2008 R2 supporta la compressione? Se sì, accendilo.

Correggimi se sbaglio.


Potresti approfondire il motivo per cui non ci sarebbero benefici sulle prestazioni? Per lo meno, spiega perché questo è il caso in cui file separati consentono a SQL Server di utilizzare più thread per la lettura.

Se si mette tutta la tabella sul proprio filegroup ma sulla stessa unità le prestazioni saranno uguali prima del partizionamento. Ma se stai separando alcune tabelle nei loro filegroup su un disco più veloce diverso, avrai un vantaggio in termini di prestazioni. Ad esempio, puoi anche partizionare per anno se hai molti dati che dipendono dall'anno. Con questa tecnica puoi conservare i tuoi dati più usati su un disco più veloce di quelli vecchi. Puoi anche separare gli indici, ma solo se li inserirai in un nuovo disco fisico avrai un vantaggio in termini di prestazioni.

Hai ragione sui thread paralleli (tabelle / file) ma penso che fino a quando non avrai un solo disco fisico il guadagno delle prestazioni sarà piccolo.

E ti consiglio di procurarti un array RAID HDD stretto per il database perché l'SSD morirà presto.
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.