Kontakty

Vytvorenie fyzickej databázy Model: Produktový dizajn. Vytvorenie fyzického modelu databázy: Projektovanie rozdelenia SQL Server

Dobrý večer / deň / ráno drahý habraloudi! Pokračujeme v rozvíjaní a dopĺňaní blogu o mojom obľúbenom otvorenom zdroji RDBMS Postgresql. Bolo to zázračne, takže sa ukázalo, že téma dnešnej témy nikdy nebola zvýšená. Musím povedať, že rozdelenie v PostgreSQL je veľmi dobre opísané v dokumentácii, ale zastaví ma?).

Úvod

Všeobecne platí, že v rámci rozdelenia, vo všeobecnosti chápe, že nie sú niektoré technológie, ale skôr prístup k dizajnu databázy, ktorá sa objavila dlho predtým, ako DBMS začali udržiavať tzv. Rozdelených tabuliek. Myšlienka je veľmi jednoduchá - rozdeľte stôl do niekoľkých častí menšej veľkosti. Existujú dva poddruhy - horizontálne a vertikálne rozdelenie.
Horizontálne rozdelenie
Časti tabuľky obsahujú rôzne čiary. Nastavujeme nás tabuľku protokolov určitej abstraktnej aplikácie - guľatiny. Môžeme ho zlomiť na časti - jeden pre protokoly v januári 2009, druhý - do februára 2009 atď.
Vertikálne rozdelenie
Časti tabuľky obsahujú rôzne stĺpce. Nájdite žiadosť o vertikálne rozdelenie (keď je naozaj oprávnená) trochu zložitejšie ako pre horizontálne. Ako sférický kôň, navrhujem zvážiť túto možnosť: Tlačový stôl má ID, Shorttext, Longtext, a nechať pole Longtext sa používa oveľa menej ako prvé dve. V tomto prípade to dáva zmysel rozbiť novinovú tabuľku na stĺpci (Vytvorte dve tabuľky pre Shorttext a Longtext, resp. Súvisiace primárne tlačidlá + Vytvorenie zobrazenia Novinky obsahujúce obidva stĺpce). Tak, keď potrebujeme popis správy, DBMS nemusí čítať z disku aj celé textové správy.
Podpora rozdeľovania v moderných DBMS
Väčšina moderných DBMS podporuje rozdelenie tabuliek v jednej forme alebo inej.
  • Odtlačok - Podporuje oddiel začínajúci 8 verziou. Práca s úsekami na jednej strane je veľmi jednoduché (vo všeobecnosti, nemôžete premýšľať o nich, pracujete s pravidelnou tabuľkou *), a na druhej strane - všetko je veľmi flexibilné. Oddiely môžu byť rozbité na "subprav", odstrániť, rozdeliť, preniesť. Podporované sú rôzne možnosti indexovania rozdelenej tabuľky (globálny index rozdelený index). Odkaz na rozsiahly opis.
  • Microsoft SQL Server - Jednotná podpora sa nedávno objavila (v roku 2005). Prvý dojem používania - "No, konečne !! :)", druhý - "funguje, všetko sa zdá byť v poriadku." Dokumentácia o MSDN.
  • MySQL - Podporuje od verzie 5.1. Veľmi dobrý popis na habrejoch
  • Atď…
* -Etra, samozrejme, existuje štandardná sada ťažkostí - vytvoriť novú časť načas, starý, aby vyhodil, atď, ale stále nejako všetko je jednoduché a zrozumiteľné.

Rozdelenie v PostgreSQL

Rozdelenie tabuliek v PostgreSQL je o niečo odlišné od predaja z iných databáz. Základom oddielu je dedičstvo tabuliek (vec, ktorá je neoddeliteľná výlučne postgresql). To znamená, že musíme mať hlavnú tabuľku (hlavná tabuľka) a jeho časti budú stoly dedičov. Zoberieme rozdelenie na príklade úlohy, ktorá sa približuje k realite.
Formulácia problému
Databáza sa používa na zber a analýzu údajov na mieste / stránok. Objemy údajov sú dostatočne veľké, aby sa premýšľali o rozdelení. Pri analýze sa vo väčšine prípadov používajú údaje na posledný deň.
1. Vytvorte základnú tabuľku:
Vytvorte tabuľku Analytics.Events.

User_id uuid nie ,
event_type_id smalt ,
event_time Timestamp predvolené teraz () nie ,
URL Varchar (1024) nie ,
Referer varchar (1024),
IP inet nie null
);

2. Budeme rozdeliť na deň podujatím Event_time. Pre každý deň vytvoríme novú sekciu. Zavoláme sekcie podľa pravidla: analytics.events_ddmmyyyy. Napríklad časť pre 1. januára 2010.
Vytvorenie tabuľky Analytics.events_01012010.
Event_id Bigint Predvolený NextVal ("Analytics.seq_events") Primárny kľúč,
Skontrolujte (event_time\u003e \u003d časová značka "2010-01-01 00:00:00" a event_time< TIMESTAMP "2010-01-02 00:00:00" )
) Zdedí (Analytics.events);

* Tento zdrojový kód bol zvýraznený s zvýrazňovačom zdrojového kódu.


Pri vytváraní úseku, explicitne zadajte pole Event_Id (primárny kľúč nie je zdedený) a vytvorte kontrolný obmedzenie na poli Event_time, aby ste neložili príliš veľa.

3. Vytvorte index na ihrisku Event_time. Pri rozdeľovaní tabuľky v sekcii znamená, že väčšina požiadaviek na tabuľku udalostí použije stav na poli Event_time, takže index na tomto poli nám pomôže veľmi veľa.

Vytvorenie indexových udalostí_01012010_Event_Time_idx na Analytics.events_01012010 Používanie BTREE (event_time);

* Tento zdrojový kód bol zvýraznený s zvýrazňovačom zdrojového kódu.


4. Chceme zabezpečiť, aby sa pri vkladaní do hlavnej tabuľky, údaje sa ukázali ako sekciu určená pre nich. Aby sme to urobili, urobíme ďalšiu indikáciu - vytvoríme spúšť, ktorý bude spravovať dátové toky.
Vytvorte alebo vymeňte funkciu Analytics.events_insert_tright ()
Vráti spúšť ako $ $
Začať.
Ak (nový .EVENT_TIME\u003e \u003d TIMESTAMP "2010-01-01 00:00:00" A
Nový .event_time.< TIMESTAMP "2010-01-02 00:00:00" ) THEN
Vložiť do analytics.events_01012010 Hodnoty (nové. *);
Inak.
Zvýšiť výnimku "Dátum% je mimo rozsahu. Opraviť analytics.events_insert_trigger", Nový .event_time;
KONIEC AK;
Návrat null;
Koniec;
$$
Jazyk plpgsql;

* Tento zdrojový kód bol zvýraznený s zvýrazňovačom zdrojového kódu.


Vytvorte spúšť udalosti_before_insert.
Pred vložením na analytics.evens
Pre každý riadok vykonajte proces analytics.events_insert_trigger ();

* Tento zdrojový kód bol zvýraznený s zvýrazňovačom zdrojového kódu.

5. Všetko je pripravené, teraz máme rozdelenú tabuľku Analytics.Events. Môžeme začať násilne analyzovať svoje údaje. Mimochodom, skontrolujte obmedzenia, ktoré sme vytvorili nielen na ochranu sekcií z nesprávnych údajov. PostgreSQL ich môže používať pri vypracovaní plánu žiadostí (hoci, s živou indexom na akciu_time, výhru mu poskytnú minimum), stačí použiť smernicu o obmedzení_exclusion:

Nastaviť obmedzenie_exclusion \u003d ďalej;
Vyberte * z analytics.events, kde event_time\u003e prúd_date;

* Tento zdrojový kód bol zvýraznený s zvýrazňovačom zdrojového kódu.

Koniec prvej časti
Čo máme? Pozrime sa:
1. Tabuľka podujatí, rozdelená do sekcií, analýza dostupných údajov za posledný deň sa stáva jednoduchším a rýchlejším.
2. Horor uvedomenie, že toto všetko potrebuje na nejako udržiavať, vytvárať časti včas, nezabudnite na zmenu spúšťača.

O tom, ako ľahké a neopatrné práce s rozdelenými tabuľkami povie v druhej časti.

UPD1: nahradiť rozdelenie rozdelenia
UPDP2:
Podľa pripomienok jedného z čitateľov, ktorí nemajú, bohužiaľ, účet na habrej:
S dedičstvom je pripojených niekoľko okamihov, ktoré by sa mali brať do úvahy pri navrhovaní. Oddiely NEPOUŽÍVAJTE NAJVYŠŠIA KĽÚČOVANÝM KĽÚČOVÝMI KĽÚČOVÝMI KĽÚČOVÝMI KĽÚČAMI NA TECHNIKACH. To znamená, že pri vytváraní úseku musíte výslovne vytvoriť primárny kľúč a cudzie klávesy na stĺpci sekcií. Od seba poznamenávam, že vytváranie cudzieho kľúča na stĺpci rozdeleného stola nie je najlepší spôsob. Vo väčšine prípadov je rozdelená tabuľka "tabuľka faktov" a samo o sebe označuje tabuľku "Rozmery".

Dobrý večer / deň / ráno drahý habraloudi! Pokračujeme v rozvíjaní a dopĺňaní blogu o mojom obľúbenom otvorenom zdroji RDBMS Postgresql. Bolo to zázračne, takže sa ukázalo, že téma dnešnej témy nikdy nebola zvýšená. Musím povedať, že rozdelenie v PostgreSQL je veľmi dobre opísané v dokumentácii, ale zastaví ma?).

Úvod

Všeobecne platí, že v rámci rozdelenia, vo všeobecnosti chápe, že nie sú niektoré technológie, ale skôr prístup k dizajnu databázy, ktorá sa objavila dlho predtým, ako DBMS začali udržiavať tzv. Rozdelených tabuliek. Myšlienka je veľmi jednoduchá - rozdeľte stôl do niekoľkých častí menšej veľkosti. Existujú dva poddruhy - horizontálne a vertikálne rozdelenie.
Horizontálne rozdelenie
Časti tabuľky obsahujú rôzne čiary. Nastavujeme nás tabuľku protokolov určitej abstraktnej aplikácie - guľatiny. Môžeme ho zlomiť na časti - jeden pre protokoly v januári 2009, druhý - do februára 2009 atď.
Vertikálne rozdelenie
Časti tabuľky obsahujú rôzne stĺpce. Nájdite žiadosť o vertikálne rozdelenie (keď je naozaj oprávnená) trochu zložitejšie ako pre horizontálne. Ako sférický kôň, navrhujem zvážiť túto možnosť: Tlačový stôl má ID, Shorttext, Longtext, a nechať pole Longtext sa používa oveľa menej ako prvé dve. V tomto prípade to dáva zmysel rozbiť novinovú tabuľku na stĺpci (Vytvorte dve tabuľky pre Shorttext a Longtext, resp. Súvisiace primárne tlačidlá + Vytvorenie zobrazenia Novinky obsahujúce obidva stĺpce). Tak, keď potrebujeme popis správy, DBMS nemusí čítať z disku aj celé textové správy.
Podpora rozdeľovania v moderných DBMS
Väčšina moderných DBMS podporuje rozdelenie tabuliek v jednej forme alebo inej.
  • Odtlačok - Podporuje oddiel začínajúci 8 verziou. Práca s úsekami na jednej strane je veľmi jednoduché (vo všeobecnosti, nemôžete premýšľať o nich, pracujete s pravidelnou tabuľkou *), a na druhej strane - všetko je veľmi flexibilné. Oddiely môžu byť rozbité na "subprav", odstrániť, rozdeliť, preniesť. Podporované sú rôzne možnosti indexovania rozdelenej tabuľky (globálny index rozdelený index). Odkaz na rozsiahly opis.
  • Microsoft SQL Server - Jednotná podpora sa nedávno objavila (v roku 2005). Prvý dojem používania - "No, konečne !! :)", druhý - "funguje, všetko sa zdá byť v poriadku." Dokumentácia o MSDN.
  • MySQL - Podporuje od verzie 5.1.
  • Atď…
* -Etra, samozrejme, existuje štandardná sada ťažkostí - vytvoriť novú časť načas, starý, aby vyhodil, atď, ale stále nejako všetko je jednoduché a zrozumiteľné.

Rozdelenie v PostgreSQL

Rozdelenie tabuliek v PostgreSQL je o niečo odlišné od predaja z iných databáz. Základom oddielu je dedičstvo tabuliek (vec, ktorá je neoddeliteľná výlučne postgresql). To znamená, že musíme mať hlavnú tabuľku (hlavná tabuľka) a jeho časti budú stoly dedičov. Zoberieme rozdelenie na príklade úlohy, ktorá sa približuje k realite.
Formulácia problému
Databáza sa používa na zber a analýzu údajov na mieste / stránok. Objemy údajov sú dostatočne veľké, aby sa premýšľali o rozdelení. Pri analýze sa vo väčšine prípadov používajú údaje na posledný deň.
1. Vytvorte základnú tabuľku:
Vytvorte tabuľku Analytics.Events.

User_id uuid nie ,
event_type_id smalt ,
event_time Timestamp predvolené teraz () nie ,
URL Varchar (1024) nie ,
Referer varchar (1024),
IP inet nie null
);

2. Budeme rozdeliť na deň podujatím Event_time. Pre každý deň vytvoríme novú sekciu. Zavoláme sekcie podľa pravidla: analytics.events_ddmmyyyy. Napríklad časť pre 1. januára 2010.
Vytvorenie tabuľky Analytics.events_01012010.
Event_id Bigint Predvolený NextVal ("Analytics.seq_events") Primárny kľúč,
Skontrolujte (event_time\u003e \u003d časová značka "2010-01-01 00:00:00" a event_time< TIMESTAMP "2010-01-02 00:00:00" )
) Zdedí (Analytics.events);

* Tento zdrojový kód bol zvýraznený s zvýrazňovačom zdrojového kódu.


Pri vytváraní úseku, explicitne zadajte pole Event_Id (primárny kľúč nie je zdedený) a vytvorte kontrolný obmedzenie na poli Event_time, aby ste neložili príliš veľa.

3. Vytvorte index na ihrisku Event_time. Pri rozdeľovaní tabuľky v sekcii znamená, že väčšina požiadaviek na tabuľku udalostí použije stav na poli Event_time, takže index na tomto poli nám pomôže veľmi veľa.

Vytvorenie indexových udalostí_01012010_Event_Time_idx na Analytics.events_01012010 Používanie BTREE (event_time);

* Tento zdrojový kód bol zvýraznený s zvýrazňovačom zdrojového kódu.


4. Chceme zabezpečiť, aby sa pri vkladaní do hlavnej tabuľky, údaje sa ukázali ako sekciu určená pre nich. Aby sme to urobili, urobíme ďalšiu indikáciu - vytvoríme spúšť, ktorý bude spravovať dátové toky.
Vytvorte alebo vymeňte funkciu Analytics.events_insert_tright ()
Vráti spúšť ako $ $
Začať.
Ak (nový .EVENT_TIME\u003e \u003d TIMESTAMP "2010-01-01 00:00:00" A
Nový .event_time.< TIMESTAMP "2010-01-02 00:00:00" ) THEN
Vložiť do analytics.events_01012010 Hodnoty (nové. *);
Inak.
Zvýšiť výnimku "Dátum% je mimo rozsahu. Opraviť analytics.events_insert_trigger", Nový .event_time;
KONIEC AK;
Návrat null;
Koniec;
$$
Jazyk plpgsql;

* Tento zdrojový kód bol zvýraznený s zvýrazňovačom zdrojového kódu.


Vytvorte spúšť udalosti_before_insert.
Pred vložením na analytics.evens
Pre každý riadok vykonajte proces analytics.events_insert_trigger ();

* Tento zdrojový kód bol zvýraznený s zvýrazňovačom zdrojového kódu.

5. Všetko je pripravené, teraz máme rozdelenú tabuľku Analytics.Events. Môžeme začať násilne analyzovať svoje údaje. Mimochodom, skontrolujte obmedzenia, ktoré sme vytvorili nielen na ochranu sekcií z nesprávnych údajov. PostgreSQL ich môže používať pri vypracovaní plánu žiadostí (hoci, s živou indexom na akciu_time, výhru mu poskytnú minimum), stačí použiť smernicu o obmedzení_exclusion:

Nastaviť obmedzenie_exclusion \u003d ďalej;
Vyberte * z analytics.events, kde event_time\u003e prúd_date;

* Tento zdrojový kód bol zvýraznený s zvýrazňovačom zdrojového kódu.

Koniec prvej časti
Čo máme? Pozrime sa:
1. Tabuľka podujatí, rozdelená do sekcií, analýza dostupných údajov za posledný deň sa stáva jednoduchším a rýchlejším.
2. Horor uvedomenie, že toto všetko potrebuje na nejako udržiavať, vytvárať časti včas, nezabudnite na zmenu spúšťača.

O tom, ako ľahké a neopatrné práce s rozdelenými tabuľkami povie v druhej časti.

UPD1: nahradiť rozdelenie rozdelenia
UPDP2:
Podľa pripomienok jedného z čitateľov, ktorí nemajú, bohužiaľ, účet na habrej:
S dedičstvom je pripojených niekoľko okamihov, ktoré by sa mali brať do úvahy pri navrhovaní. Oddiely NEPOUŽÍVAJTE NAJVYŠŠIA KĽÚČOVANÝM KĽÚČOVÝMI KĽÚČOVÝMI KĽÚČOVÝMI KĽÚČAMI NA TECHNIKACH. To znamená, že pri vytváraní úseku musíte výslovne vytvoriť primárny kľúč a cudzie klávesy na stĺpci sekcií. Od seba poznamenávam, že vytváranie cudzieho kľúča na stĺpci rozdeleného stola nie je najlepší spôsob. Vo väčšine prípadov je rozdelená tabuľka "tabuľka faktov" a samo o sebe označuje tabuľku "Rozmery".

V priebehu práce na veľkých tabuľkách sa neustále stretávame s problémami s výkonom ich aktualizácií údržby a údajov. Jedným z najproduktívnejších a pohodlných riešení vznikajúcich problémov je rozdelenie.
Ak všeobecne slová, rozdelenie rozdeľuje tabuľku alebo index na bloky. V závislosti od nastavenia rozdelenia môžu byť bloky rôznych veľkostí, môžu byť uložené v rôznych súboroch a súboroch.
Sekcia má výhody aj nevýhody.
Výhody sú dobre natreté na webovej stránke spoločnosti Microsoft, budem dávať excerpt:

« Rozdelenie veľkých tabuliek alebo indexov môže poskytnúť nasledujúce výhody v ovládateľnosti a výkonnosti.

  • To vám umožní rýchlo a efektívne prenášať podmnožiny údajov a prístup k nim, pri zachovaní integrity súboru údajov. Napríklad taká operácia, pretože dátové zaťaženie z OLTP do systému OLAP sa vykonáva v sekundách, a nie v minútach a hodinách, ako v prípade non-odolných údajov.
  • Servisné operácie môžu byť vykonané rýchlejšie s jednou alebo viacerými sekciami. Operácie sú efektívnejšie, pretože sa vykonávajú len s konfliktovaním údajov a nie s celú tabuľku. Môžete napríklad komprimovať údaje do jednej alebo viacerých sekcií alebo obnoviť jednu alebo viac indexových sekcií.
  • Môžete zvýšiť rýchlosť vykonania požiadaviek v závislosti od požiadaviek, ktoré sa často vykonávajú vo vašej konfigurácii hardvéru. Napríklad optimalizátor dopytu môže rýchlejšie vykonávať požiadavky na equithown dvoch a viac rozdelených tabuliek, ak sú tieto tabuľky rovnaké stĺpce rozdelenia, pretože môžete pripojiť samotné časti.

V procese triediacich údajov pre I / O operácie v SQL Server je najprv triedenie údajov o sekciách. SQL Server môže súčasne kontaktovať iba jeden disk, ktorý môže znížiť výkon. Ak chcete urýchliť triedenie dát, odporúča sa distribuovať dátové súbory v sekciách cez viac pevných diskov vytvorením RAID. Napriek triedeniu dát podľa sekcií bude SQL Server schopný súčasne pristupovať ku všetkým pevným diskom každej časti.
Okrem toho je možné zvýšiť produktivitu pomocou blokávok na úrovni sekcií, a nie celý stôl. Môže znížiť počet konfliktov zámkov pre tabuľku
».

Nevýhody zahŕňajú zložitosť v podávaní a podpore prevádzky rozdelených tabuliek.

Nebudeme prebývať na implementácii rozdelenia, pretože táto otázka je veľmi dobre opísaná na webovej stránke spoločnosti Microsoft.

Namiesto toho sa pokúsime ukázať, ako optimalizovať prevádzku rozdelených tabuliek a presnejšie zobraziť optimálne (podľa nášho názoru) spôsob, ako aktualizovať údaje pre akýkoľvek časový interval.

Fyzickým rozlíšením týchto častí je veľká plus rozdelená tabuľka. Táto vlastnosť nám umožňuje zmeniť časti na niektorých miestach alebo s inou tabuľkou.
S obvyklým aktualizáciou údajov pomocou posuvného okna (napríklad pre mesiac) budeme musieť prejsť nasledujúcimi krokmi:

1. Nájdite požadované čiary vo veľkom stole;
2. Odstráňte nájdené riadky z tabuľky a indexu;
3. Vložte nové riadky do tabuľky, aktualizujte index.

Pri ukladaní v tabuľke miliárd riadkov, tieto operácie budú mať pomerne dlhú dobu, môžeme sa obmedziť na takmer jednu akciu: stačí nahradiť požadovanú časť na tabuľku pripravenú vopred (alebo časť). V tomto prípade nebudeme musieť odstrániť alebo vložiť reťazce, rovnako ako potrebujete aktualizovať index na celom veľkom stole.

Poďme zo slov na podnikanie a ukázať, ako ho implementovať.

1. Začať, nastaviť rozdelenú tabuľku, ako je uvedené v uvedenom článku.
2. Vytvorte tabuľky potrebné na výmenu.

Ak chcete aktualizovať údaje, budeme potrebovať mini-kópiu cieľovej tabuľky. Mini-copy je, že to bude uložené údaje, ktoré by mali byť pridané do cieľovej tabuľky, t.j. Údaje za 1 mesiac. Tretia prázdna tabuľka bude tiež musieť implementovať výmenu údajov. Prečo je to potrebné - vysvetlím neskôr.

Tvrdé podmienky sú umiestnené na mini-kópiu a tabuľku pre výmenu:

  • Pred použitím operátora prepínača by mali existovať obe tabuľky. Pred vykonaním spínacej prevádzky v databáze musí existovať tabuľka, kde sa časť (zdrojová tabuľka) pohybuje z miesta, kde výberová tabuľka (cieľová tabuľka).
  • Oddiel príjemcu musí existovať a mal by byť prázdny. Ak sa tabuľka pridá ako úsek na existujúce rozdelenej tabuľke alebo časti pohybujú sa z jedného rozdeleného stola do druhej, musí existovať recipientná časť a byť prázdna.
  • Nekombinovaná tabuľka príjemcu musí existovať a mala by byť prázdna. Ak je sekcia navrhnutá tak, aby vytvorila jednotnú nedeselnú tabuľku, potom je potrebné, aby tabuľka prijímajúca novú časť existuje a bola prázdna ne-prechodná tabuľka.
  • Oddiely musia byť z toho istého stĺpca. Ak je sekcia prepnutá z jedného rozdeleného stola do druhej, obidve tabuľky musia byť rozdelené na rovnaký stĺpec.
  • Zdrojové a cieľové tabuľky musia byť v rovnakej skupine súborov. Zdrojová a cieľová tabuľka v pokynoch meniacu sa ... Spínacie pokyny by mali byť uložené v rovnakej skupine súborov, ako aj ich stĺpce s veľkými hodnotami. Všetky príslušné indexy, indexové úseky alebo indexované časti by sa mali uchovávať aj v rovnakej skupine súborov. Môže sa však líšiť od skupiny súborov pre zodpovedajúce tabuľky alebo iné relevantné indexy.

Vysvetlím obmedzenia na našom príklade:

1. Mini-kópia tabuľky musí byť rozdelená na rovnaký stĺpec ako cieľ. Ak mini-kópia nie je rozdelená tabuľka, potom musí byť uložená v rovnakej skupine súborov ako náhradný sekcia.

2. Tabuľka výmeny musí byť prázdna a mala by byť tiež rozdelená na rovnaký stĺpec alebo by mal byť uložený v tej istej skupine súborov.

3. Implementujeme výmenu.

Teraz máme nasledovné:
Tabuľka s údajmi pre všetky časy (nasledujúca tabuľka)
Tabuľka s údajmi po dobu 1 mesiaca (nasledujúca tabuľka)
Prázdny stôl (nasledujúci tabuľka)

Po prvé, musíme zistiť, v ktorej sekcii máme údaje.
Nájdete ho v dotaze:

Vybrať
Počet (*) ako
, $ Oddiel (dt) as
, Rank () (Objednajte si oddielu $. (DT))
Od DBO. (Nolock)
Skupina podľa $ Partition. (DT)

V tomto dotaze dostávame sekcie, v ktorých sú s informáciami riadky. Množstvo sa nedá počítať - urobili sme to, aby sme skontrolovali potrebu výmeny údajov. Rank tiež používa, aby ste mohli ísť v cykle a aktualizovať niekoľko sekcií v jednom procese.

Akonáhle sa zistili, v ktorých sekciách sa údaje uložia - môžu byť zmenené na miestach. Predpokladajme, že údaje sú uložené v časti 1.

Potom musíte vykonať nasledujúce operácie:
Zmeňte úseky z cieľovej tabuľky s tabuľkou na výmenu.
Zmeniť tabuľku. Prepnite oddiel 1 na. Oddiel 1.
Teraz máme nasledovné:
Cieľová tabuľka nemala údaje v sekcii, ktorú potrebujeme, t.j. Sekcia je prázdna
Swap sekcií z cieľovej tabuľky a mini-kópie
Zmeniť tabuľku. Prepnite oddiel 1 na. Oddiel 1.
Teraz máme nasledovné:
Cieľová tabuľka sa objavila údaje za mesiac a v mini-kópiách teraz prázdnota
Vymazať alebo odstrániť tabuľku na výmenu.

Ak máte na stole index klastra, nie je to aj problém. Musí byť vytvorený na všetkých 3 tabuľkách s rozdelením jedného podľa toho istého stĺpca. Pri zmene sekcií sa index automaticky aktualizuje, nie prestavba.

Strana 23 z 33

Rozsah - Obchodné informácie

Povaha použitia informácií o predaji je často premenlivý. Údaje o aktuálnom mesiaci sú spravidla operačné údaje; Údaje z predchádzajúcich mesiacov sú vo veľkej miere údaje určené na analýzu. Najčastejšie sa analýza vykonáva mesačne, štvrťročne alebo ročne. Keďže rôzni analytici môžu vyžadovať zároveň významné množstvá rôznych analytických údajov, rozdelenie je najlepšie umožniť izolovať ich aktivity. V nasledujúcom scenári sa tieto údaje flock z 283 uzlov a dodávajú sa ako dva štandardné súbory formátu ASCII. Všetky súbory sa odosielajú do centrálneho servera súborov najneskôr do 3.00 AM prvý deň každého mesiaca. Veľkosti súborov kolíše, ale v priemere je približne 86 000 objednávok mesačne. Každá objednávka v priemere je 2,63 pozícií, takže objednávky sú v priemere 226180 riadkov. Každý mesiac sa pridáva približne 25 miliónov nových objednávok a 64 miliónov riadkov nomenklatúry objednávok. Server analýzy histórie podporuje údaje za posledné 2 roky. Údaje po dobu dvoch rokov je o niečo menej ako 600 miliónov objednávok a viac ako 1,5 miliardy riadkov v tabuľke OrderDetails. Keďže údaje sa často analyzujú porovnaním ukazovateľov rovnakých štvrtí, alebo v tých istých mesiacoch na predchádzajúce roky, vyberie sa rozdelenie rozsahu. Mesiac je zvolený ako veľkosť rozsahu.

Na základe schémy 11 ("Kroky na vytvorenie rozdelenej tabuľky") sme sa rozhodli rozdeliť tabuľku pomocou rozdielu na stĺpci objednávky. Naši analytici sa zjednotia a analyzujú posledných 6 mesiacov, alebo posledných 3 mesiacov súčasného a minulého roka (napríklad január-marca 2003 plus január až marec 2004). S cieľom maximalizovať zväzok diskov a zároveň izolovať väčšinu zubných skupín, tam bude niekoľko súborov súborov na jednom fyzickom disku, ale budú presunuté šesť mesiacov, aby sa znížil počet konfliktov, keď oddelenie zdrojov . Aktuálny mesiac - október 2004 a všetkých 283 samostatných kancelárií riadia ich aktuálny predaj lokálne. Server ukladá údaje z októbra 2002 do septembra 2004 vrátane. Aby bolo možné využiť nový 16-procesorový systém a SAN (Storage Area Network - vysokorýchlostná sieť, ktorá spája dátové sklady), každý mesiac bude vo svojom vlastnom súbore Súbor súborov a umiestnený na súbor striedavých zrkadiel ( RAID 1 + 0). Obrázok 12 znázorňuje umiestnenie dát na logických diskoch.


Obrázok 12: Tabuľka rozdelených objednávok

Každý z 12 logických diskov používa konfiguráciu RAID 1 + 0, takže celkový počet diskov potrebných pre tabuľky objednávok a objednávky je 48. Napriek tomu SAN podporuje až 78 diskov, takže zvyšné 30 diskov sa používa na protokol transakcií , TEMPDB, systémové databázy a iné malé tabuľky, ako sú zákazníci (9 miliónov vstupov) a výrobkov (386 750 záznamov) atď. Tabuľky objednávok a objednávok budú používať rovnaké hraničné podmienky a rovnaké umiestnenie na disku; V skutočnosti budú používať rovnakú schému rozdelenia. V dôsledku toho (pozrite sa na dva logické disky E: a F: Obrázok 13) Tabuľkové dátové objednávky a OrderDetails za tie isté mesiace budú umiestnené na tých istých diskoch:


Obrázok 13: Umiestnenie rozsahov rôznych úsekov na diskové polia

Aj keď to vyzerá mätúce, toto je celkom jednoduché implementovať. Najťažšia vec pri vytváraní našej rozdelenej tabuľky je dodávka údajov z veľkého počtu zdrojov - 283 archív musí mať štandardný mechanizmus doručenia. Avšak, na centrálnom serveri existuje len jedna tabuľka objednávok a jedna tabuľka objednávokDetails. Ak chcete otáčať obidve tabuľky do oddielov, musíme najprv vytvoriť funkciu a schému rozdelenia. Systém rozdeľovania určuje fyzické umiestnenie sekcií na diskoch, preto musia existovať súbory súborov. Keďže sú potrebné skupiny súborov pre naše tabuľky, ďalší krok je ich vytvorenie. Syntax vytvárania každej skupiny súborov je totožná s vyššie uvedeným, ale týmto spôsobom musí byť vytvorené všetky dvadsaťštyri súborov. Môžete zmeniť mená / umiestnenie diskov na jeden disk, aby ste mohli testovať a preskúmať syntax. Uistite sa, že ste opravili veľkosť súborov na MB namiesto GB a vyberte si menšiu počiatočnú veľkosť súboru, na základe dostupného miesta na disku. V databáze SaalesDB sa vytvorí dvadsaťštyri súborov a súborov súborov. Všetko bude mať podobnú syntax s výnimkou umiestnenia, názvu súboru a názvu súboru:

Alter Database SalesDB.
Pridať súbor.
(NAME \u003d N "SALESDBFG1FILE1",
Filename \u003d N. "E: SALESDB SALESDBFG1FILE1.NDF",
Veľkosť \u003d 20 gb,
Maxsize \u003d 35 GB,
Filegrowth \u003d 5 GB)
Filegroup
Ísť.

Akonáhle sú vytvorené všetky dvadsaťštyri súborov a súborov súborov, môžete určiť funkciu a schému rozdelenia. Uistite sa, že sú vytvorené súbory súborov a súborov, môžete použiť SP_HELPFILE a SP_HELPFILEG systémový systém uložené procedúry.

Funkcia sekcií bude určená stĺpou OrderDate s typom údajov DateTime. Aby sa obidve tabuľky boli rozdelené do stĺpca objednávky, musí byť tento stĺpec prítomný v oboch tabuľkách. V skutočnosti, hodnoty kľúčových tlačidiel oboch tabuliek (ak sú obe tabuľky rozdelené jedným a rovnaký kľúč) sa navzájom duplikujú; Avšak, toto je potrebné získať výhody zarovnania, vo väčšine prípadov bude veľkosť kľúčových stĺpcov relatívne malá (veľkosť pole datetime je len 8 bajtov). Ako už bolo opísané v kapitole "Vytvoriť funkciu oddielu pre rozsah" kapitola, naša funkcia bude radom rozdeľovacej funkcie, v ktorej bude prvý hraničný stav v prvej (ľavej) úseku.

Vytvorte funkciu oddielu TwyearDaterangePFN (DateTime)
Ako
Rozsah doľava pre hodnoty ("20021031 23: 59: 59,997", - 2002
"20021130 23: 59: 59,997", - november 2002
"20021231 23: 59: 59,997" - dec 2002
"20030131 23: 59: 59,997" - Jan 2003
"20030228 23: 59: 59,997" - FEB 2003
"20030331 23: 59: 59,997" - Mar 2003
"20030430 23: 59: 59,997" - APR 2003
"20030531 23: 59: 59,997" - máj 2003
"20030630 23: 59: 59,997", - jún 2003
"20030731 23: 59: 59,997" - júl 2003
"20030831 23: 59: 59,997" - Aug 2003
"20030930 23: 59: 59,997" - sep 2003
"20031031 23: 59: 59,997" - október 2003
"20031130 23: 59: 59,997" - Nov 2003
"20031231 23: 59: 59,997" - dec 2003
"20040131 23: 59: 59,997", - Jan 2004
"20040229 23: 59: 59,997", - FEB 2004
"20040331 23: 59: 59,997" - Mar 2004
"20040430 23: 59: 59,997" - APR 2004
"20040531 23: 59: 59,997" - máj 2004
"20040630 23: 59: 59,997" - jún 2004
"20040731 23: 59: 59,997", - júl 2004
"20040831 23: 59: 59,997" - Aug 2004
"20040930 23: 59: 59,997") - sep 2004
Ísť.

Vzhľadom k tomu, že je extrémne ľavá, a sú pokryté mimoriadne pravé hraničné prípady, táto funkcia rozdelenia skutočne vytvára 25 sekcií. Tabuľka podporí 25. časť, ktorá zostane prázdna. Pre túto prázdnu časť nie je potrebná žiadna špeciálna skupina súborov, pretože sa do nemu nemajú dostať žiadne údaje. Aby sa zabezpečilo, že žiadne údaje v nej nespadá, obmedzí rozsah tejto tabuľky. Aby ste mohli odosielať údaje na zodpovedajúce disky, používa sa schéma rozdeľovania, ktorá zobrazuje časti na skupiny súborov. Systém rozdelenia použije explicitnú definíciu súborov súborov pre každú z 24 skupín súborov obsahujúcich údaje a primárne - pre 25. prázdnu časť.

Vytvoriť systém oddielu.
Ako
Oddiel twyardaterangepfn.
(, , , , , ,
, , , ,,,
,,,,,,
,,,,,,
Ísť.

Tabuľka môže byť vytvorená s rovnakou syntaxou, ktorá podporovaná predchádzajúcim verziou SQL Server - pomocou predvolenej alebo užívateľom definovanej súborovej skupiny (na vytvorenie non-rozdelenej tabuľky) - buď pomocou schémy (na vytvorenie rozdelenej tabuľky). Pokiaľ ide o to, akú možnosť je vhodnejšie (aj keď je táto tabuľka rozdelená do budúcnosti, všetko závisí od toho, ako je tabuľka plnenie a koľko sekcií sa chystáte manipulovať. Vyplnenie haldy (haldy) a následné vytvorenie klastrového indexu v ňom pravdepodobne poskytne lepší výkon ako sťahovanie do tabuľky obsahujúcej index klastra. Okrem toho, v multiprocesorových systémoch, môžete nahrať dáta do tabuľky paralelne, a potom paralelne so stavať indexy. Ako príklad vytvorte tabuľku objednávok a načítajte údaje do nej pomocou vložky ... Vyberte príkazy. Ak chcete vytvoriť tabuľku objednávok ako rozdelených, definujete schému rozdelenia v operácii vytvorenia tabuľky.

Vytvorte tabuľku predajadb ..
Nie ,
NULOVÝ
NULOVÝ
NULOVÝ
NULOVÝ
NULOVÝ
Nie ,
NULOVÝ
NULOVÝ
NULOVÝ
Nie ,
NULOVÝ
Obmedzenie objednávkyRangeyear
Skontrolujte (\u003e \u003d "20021001"
A.< "20041001" ),
NULOVÝ

Ísť.

Keďže tabuľka OrderDetails bude používať rovnakú schému, mala by obsahovať stĺpec objednávkydate.

Vytvoriť tabuľku. (
Nie ,
Nie ,
NULOVÝ
NULOVÝ
NULOVÝ
NULOVÝ
NULOVÝ
Nie null
Obmedzenie objednávkyDetailsrorangeYearck.
Skontrolujte (\u003e \u003d "20021001"
A.< "20041001" ),
NULOVÝ
Nie null
Obmedzenia.
Predvolené (Getdate ())
Ako ((*))
As ((-))
Ísť.

V ďalšom kroku sa načítajú údaje z novej databázy AdventureWorks Training Training. Uistite sa, že ste nainštalovali databázu AdventureWorks.

Vložte DBO.
Vyberte O.
, o.
, o.
, o.
, o.
, o.
, o.
, o.
, o.
, o.
, o.
, o.
, o.
Od adventureworks.purchasing.PurchAzedorderHear As O
Kde (\u003e \u003d "20021001"
A.< "20041001" )
Ísť.

Vložte DBO.
Vyberte OD.PURCHOSEIREDID
, OD.Leclesumber
, Od.produktid
, OD.UnitPrice.
, Od.ireqty
, Od.receivedqty
, od.rejectedqty
, O.orderDate.
, odíme.
, Od.modifiledate.
Z adventureworks.purchasing.purchaseorderDetail ako od
Pridajte sa k dobrodružným dielam ..Purchasing.PurchAzedorderHear As O
Na O.PURCHASEIREDID \u003d OD.PURCHASEIREDIDEID
Kde (O.\u003e \u003d "20021001"
A o.< "20041001" )
Ísť.

Teraz, keď ste si stiahli údaje do tabuľky rozdeleného, \u200b\u200bmôžete použiť novú vstavanú funkciu systému na určenie sekcie, na ktoré sa budú nachádzajú údaje. Nasledujúca žiadosť o každú z častí obsahujúcich údaje vráti informácie o tom, koľko riadkov je obsiahnutých v každej z častí, ako aj minimálnej a maximálnej hodnoty polí Objednávanie. Časť, ktorá neobsahuje riadky, nespadá do konečného výsledku.

Vyberte položku $ partition.twoyeardraangepfn (o.orderdate)
Ako
, Min (o.orderdate) ako
, Max (o.orderdate) ako
Z dbo.ruders ako o
Skupina od $ partization.twoyeardaterangepfn (o.orderdate)
Zoradiť podľa.
Ísť.

Vyberte položku $ partition.twoyeardraangepfn (od.ireddate)
Ako
, Min (od.orderdate) ako
, Max (od.orderdate) ako
, Počet (*) ako
Z dbo.ireDetails ako od
Skupina podľa $ oddielu.twoyeardaterationPFN (od.ireddate)
Zoradiť podľa.
Ísť.

Nakoniec, teraz, potom, čo ste si stiahli údaje, môžete vytvoriť index klastra a externý kľúč (cudzie kláves) medzi tabuľkami OrderDetails a objednávok. V tomto prípade bude index klastra postavený na primárnom tlačidle (primárny kľúč) rovnakým spôsobom, ako identifikujete obe tieto tabuľky podľa ich oddielu (pre OrderDetails k indexu, pridáte linkvenčný stĺpec pre jedinečnosť). V predvolenom nastavení sú pri výstavbe indexov na rozdelenom stole, sú usporiadané s ohľadom na rozdelenú tabuľku podľa tej istej schémy rozdelenia; Nie je potrebné špecifikovať schému.

Alter Tabuľkové objednávky.
Pridajte objednávky na obmedzenie.

Ísť.




Ísť.

Plná syntax, ktorá určuje schému rozdelenia, vyzerá to takto:

Alter Tabuľkové objednávky.
Pridajte objednávky na obmedzenie.
Primárny kľúč zoskupený (objednávka, objednávka)
Na twyardaterangepscheme (objednáčina)
Ísť.

Alter Table Dbo.ireDetails
Pridajte CONTRAINT CONSTROUSDETAILSPK.
Primárny kláves CLUSTERED (OBJEDNÁVKADATE, ORDYD, LINENMOMUM)
Na twyardaterangepscheme (objednáčina)
Ísť.



Páči sa vám článok? Zdieľaj to