Cind ai N file-uri intr-un filegroup SQL va distribui *alocarile* in mod
balansat astfel incit fiecare file sa fie la fel de incarcat,
proportional. Deci daca ai un file de 30GB care e full 33%, unul de
20GB care e full 100% si unul de 10GB care e gol si *aloci* 100 de
extent-uri (adica cite 8 pagini), ele vor fi alocate proportional cu
*spatiul gol* in fiecare file: 67 de alocatii se duce la primul file
(care are 20GB liberi) si 33 de alocatii se duc la al treilea (care are
10GB liber).
Daca creezi o baza de date initiala cu N fieisere egale goale, atunci in
mod normal ele se for 'umple' egal in timp.
De retinut ca 'balansarea' se intimpla doar cind pagini sint *alocate*,
deci daca pur si simplu adaugi fisiere nu se va intimpla nimic,
initital. In timp se vor umple si balansa, dar initial nu vei vedea nici
un efect.
Ce poti face este:
1) pui toate 24 de discuri in RAID 10 (12 raid 0 + 12 raid 0 si raid 1
intre cele doua), prezinti la SQL un singur volum si muti MDF-ul pe el.
IO va fi stripped intre 12 discuri, si raid 1 it-i va da redundanta.
2) pui toate 24 de discuri in RAID10 (cite 2 in raid 1, si un raid 0
peste cele 12 perechi). Similar cu 1), dar este mai usor sa inlocuiesti
un disk care face kaboom. Copiezi MDF-ul de 120 Gb pe acest volum, done.
3) Daca vrei totusi sa imparti I/O-ul prin multiple-files poti sa adaugi
un nou filegroup DATA, cu N file-uri egale. Apoi copiezi toate tabelele
in DATA (ALTER TABLE ... MOVE TO ...). Apoi shrink PRIMARY filegroup,
rezultatul este ca toate datele au fost mutate in alt fielgroup si sa-u
balansat intre cele N files.
4) muti tabelele individual, in functie de ce I/O te astepti.
Cel mai usor este 1) sau 2). Pentru 4) trebuie sa intelegi bine
aplicatia, si sa urmaresti statsitici per rowset
(sys.dm_db_index_physical_stats, sys.dm_db_index_usage_stats). 3) este
relativ simplu, dar resultatul este la fel ca 1) sau 2), doar ca
trebuie/poti controla mai precis ce fisier se duce pe ce volum.
In principiu mai poti face si sa adaugi N file-uri la PRIMARY si apoi sa
faci ALTER INDEX ... ALL ... REBUILD la toate tabele, astfel incit sa
se distribuie pe toate fisierele, dar n-as recomanda asta.
Mai sint si alti factori care pot sa influenteze decizia:
- vrei sa poti sa faci piece-meal restore?
http://msdn.microsoft.com/en-us/library/ms177425.aspx. Trebuie
filegroup-uri separate.
- vrei sa folosesti partitioning si un sliding-window?
http://msdn.microsoft.com/en-us/library/aa964122%28SQL.90%29.aspx.
*Probabil* ca ai nevoie de filegrou-uri (nu e neaparat nevoie).
- o sa adaugi o solutie de high-availability, gen Mirroring?
gindeste-te cum reproduci in stand-by configuratia fizica din principal
(aceleasi volume, aceleasi file path-uri etc)
http://rusanu.com