Puncte:0

SQL Server - Cum să împărțiți un singur fișier mdf în mai multe și să partițiți datele din tabelul peste ele?

drapel pl

În speranța de a îmbunătăți performanța SQL Server, aș dori să iau baza mea de date simplă cu 1 fișier (1 mdf și 1 ldf) și să împart fișierele mdf (și poate fișierele ldf) pe mai multe unități de disc. Mă gândesc că cel mai performant mod de a face acest lucru ar fi să partiționați tabelele mari în acele fișiere mdf multiple. (Plănuiesc doar să folosesc o funcție de partiție care este un modul al cheii primare (care este un int sau bigint), cum ar fi (MyTable.Id % 8), unde 8 este numărul de discuri pe care le am).

Care este cel mai rapid/cel mai bun/corect mod de a face asta? De exemplu, ce comenzi SQL sau operațiuni SSMS trebuie să fac pentru a mă duce de unde sunt acum până unde vreau să ajung.

Orice alte sugestii ar fi de asemenea apreciate. (Combinarea unităților prin spații de stocare pur și simplu nu pare o opțiune, pentru că, dintr-un motiv oarecare, pur și simplu nu obțin performanțe bune de scriere IOPS atunci când fac asta.)

Puncte:1
drapel cn

Nu trebuie să implicați partiționarea (dar ar putea dacă aveți un alt motiv). Dacă creați un nou grup de fișiere care conține fișierele fizice pe care le doriți și reconstruiți indexul pe noul grup de fișiere, ar trebui să fie suficient pentru a răspândi datele în acele fișiere fizice.

Procesul de reconstrucție va arăta cam așa. Să presupunem că indexul curent are următoarea definiție:

creați indexul grupat [CIX_foo] pe dbo.foo (FooID) pe [PRIMARY];

L-ai putea reconstrui astfel:

creați indexul grupat [CIX_foo] pe dbo.foo (FooID) cu (drop_existing = on) pe [NewFileGroup];

Utilizați orice alte opțiuni pe care le-ați utiliza în mod normal la crearea acelui index (adică sort_in_tempdb, pad_index, online, reluabil etc.).Luați în considerare, de asemenea, dacă modificarea setării de compresie a indexului existent are sens - rescrieți întregul index, așa că acum ar fi momentul!

În cele din urmă, ca recomandare, aș crea cel puțin două fișiere pe unitate în noul grup de fișiere. De ce? Dacă SWAG-ul dvs. de 8 fișiere (și probabil 8 unități) nu este suficient pentru cazul dvs. de utilizare, va trebui să treceți din nou prin procesul de reconstrucție a indexului de mai sus. Dar dacă o faceți, să spunem două fișiere pe unitate (pentru un total de șaisprezece), puteți asigura noul spațiu de stocare și puteți face doar o copie a fișierelor sistemului de fișiere (în timp ce db-ul este offline) sau o restaurare specificând noile locații. Oricare dintre acestea ar trebui să fie mai rapidă decât reconstruirea indicilor.

N73k avatar
drapel pl
Multumesc Ben. Întrebarea 1: Cum ar ști SQL Server în ce fișier se află o anumită înregistrare? Întrebarea 2: Ar exista un avantaj de viteză în utilizarea unei funcții de partiție, așa cum spuneam în întrebarea mea inițială? Întrebarea 3: Bănuiesc că, dacă vreau să mut indecși (și nu doar tabele) în acel nou grup de fișiere (și să răspândesc datele în fișiere), ar trebui să fac același tip de comandă pentru fiecare index.
Ben Thul avatar
drapel cn
1. Puțin dincolo de sfera întrebării. Adică, ce problemă vă ajută să aveți aceste cunoștințe să rezolvați? 2. Partiționarea în mssql este mai mult o soluție de gestionare a datelor decât una de performanță. Vă permite să schimbați datele într-un tabel ca operație de metadate. Cazul clasic este încărcarea unui DW în care ați ETL o zi de date într-un tabel de staging și apoi le-ați schimba când ați terminat. 3. Da - fiecare heap sau B-tree există într-un spațiu de date. Un grup de fișiere este un tip de spațiu de date (celălalt fiind o schemă de partiție). Orice index pe care îl doriți în noul dvs. FG ar trebui mutat în mod explicit.
N73k avatar
drapel pl
Pentru Q1: Sunt interesat de performanță. Deci, dacă SQL Server dorește să răstoarne unele înregistrări, va trebui să verifice fiecare unitate pentru a vedea unde sunt sau ar trebui să fie acele înregistrări sau are o modalitate rapidă de a ști (chiar și fără o funcție de partiție) unde sunt acele date (sau ar trebui să meargă) astfel încât să fie accesat doar 1 disc?
Ben Thul avatar
drapel cn
În linii mari, datele vor fi distribuite uniform în toate fișierele din FG. Abordând îngrijorarea dvs., SQL nu face împrăștiere/strângere pentru a localiza datele, ci mai degrabă navighează în arborele B pentru a localiza paginile de date corespunzătoare (și, prin extensie, fișierele care conțin acele pagini).
N73k avatar
drapel pl
Ei bine, Ben, a trecut ceva timp și încă nu ai un aur. Dar nu mai.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.