Krijimi i tabelave te particionuara
Se pari, do te krijojme nje tabele te particionuar dhe te verifikojme qe i particionin te dhenat.
Se pari duhet te krijojme nje funksion particionimi. Funksioni percakton sa particione do te kete si edhe cilat do te jene vlerat ne sejcilin particion
CREATE PARTITION FUNCTION MyPartitionRange (INT)
AS RANGE LEFT FOR VALUES (1,2)
Funksionin e particionimimit po e quame MyPartitionRange.
Kollona qe do te perdoret si celesi i particionimit do te jete nje kollone e tipit int.
'Range left ose right' percakton vlerat kufi nese do te shkojne majtas apo djathtas.
Kodi i mesiperm do te percaktoje nje tabele te particionuar me 3 particione.
Partition 1 – Vlerat <= 1
Partition 2 – Vlerat > 1 dhe <= 2
Partition 3 – Vlerat > 2
Tani do te krijojme nje skeme particionimi.
CREATE PARTITION SCHEME MyPartitionScheme AS
PARTITION MyPartitionRange
ALL TO ([PRIMARY])
Skema e particionimit MyPartitionScheme referon funksionin e particionimit MyPartitionRange. Per efekt te ketij shembulli particionet do te ruhen ne filegroupin primary.
Tani mund te krijojme tabelen.
Gjithecka duhet eshte qe ne krijimin e tabeles te vendosim skemen e particionimit tek klauzola “on”
CREATE TABLE MyPartitionedTable
(
i INT ,
s CHAR(8000) ,
PartCol INT
)
ON
MyPartitionScheme (PartCol)
Mund te verifikojme krijimin e particioneve per tabelen …
SELECT *
FROM sys.partitions
WHERE OBJECT_ID = OBJECT_ID('MyPartitionedTable')
…qe kthen dicka te ngjashme me…
partition_id object_id index_id partition_number hobt_id rows
------------------ ----------- --------- ---------------- ------------------ ----
72057594038714368 229575856 0 1 72057594038714368 0
72057594038779904 229575856 0 2 72057594038779904 0
72057594038845440 229575856 0 3 72057594038845440 0
Le te hedhim disa te dhena ne tabele
INSERT MyPartitionedTable (i, s, PartCol) SELECT 1, 'a', 1
INSERT MyPartitionedTable (i, s, PartCol) SELECT 2, 'a', 2
INSERT MyPartitionedTable (i, s, PartCol) SELECT 3, 'a', 2
INSERT MyPartitionedTable (i, s, PartCol) SELECT 4, 'a', 3
INSERT MyPartitionedTable (i, s, PartCol) SELECT 5, 'a', 3
INSERT MyPartitionedTable (i, s, PartCol) SELECT 6, 'a', 3
INSERT MyPartitionedTable (i, s, PartCol) SELECT 7, 'a', 4
... Te veme re nese rreshtat jane shtuar ne particionet e duhura
SELECT *
FROM sys.partitions
WHERE OBJECT_ID = OBJECT_ID('MyPartitionedTable')
… qe duhet te ktheje dicka te ngjashme me…
partition_id object_id index_id partition_number hobt_id rows
------------------- --------- ----------- ---------------- -------------------- ----
72057594038714368 229575856 0 1 72057594038714368 1
72057594038779904 229575856 0 2 72057594038779904 2
72057594038845440 229575856 0 3 72057594038845440 4
Ka nje funksion, $partition, qe na jep numrin e particionit per te dhenat.
SELECT PartitionNo = $partition.MyPartitionRange(PartCol), NumRows = COUNT(*)
FROM MyPartitionedTable
GROUP BY $partition.MyPartitionRange(PartCol)
ORDER BY $partition.MyPartitionRange(PartCol)
Komanda me poshte…
SELECT PartitionNo = $partition.MyPartitionRange(6)
…tregon qe nje rresht me vleren e kollones se particionimit 6 do te futet ne particionin 3.
Per te testuar qe komandat perdorin vetem particionin e kerkuar poe bejme particionin 2 te madh (Kjo per shkak se kollona s eshte char(8000)).
DECLARE @i INT
SELECT @i = 13
WHILE @i > 0
BEGIN
SELECT @i = @i - 1
INSERT MyPartitionedTable (i, s, PartCol)
SELECT i, s, PartCol
FROM MyPartitionedTable
WHERE PartCol = 2
END
...tani verifikojme rreshtat per cdo particion ...
SELECT *
FROM sys.partitions
WHERE OBJECT_ID = OBJECT_ID('MyPartitionedTable')
…komanda me siper kthen
/*
partition_id object_id index_id partition_number hobt_id rows
------------------- ----------- --------- ---------------- -------------------- -----
72057594041532416 2117582582 0 1 72057594041532416 1
72057594041597952 2117582582 0 2 72057594041597952 16384
72057594041663488 2117582582 0 3 72057594041663488 4
*/
Tani provoni komandat
SELECT COUNT(DISTINCT s) FROM MyPartitionedTable WHERE PartCol = 2
SELECT COUNT(DISTINCT s) FROM MyPartitionedTable WHERE PartCol = 1
Komanda e pare qe kerkon per te dhena ne particionin 2 duhet te jete me e ngadalte se komanda e dyte.
Shtimi dhe heqja e particionit
Ne shembullin e meparshem krijuam nje tabele te re te particionuar. Gjithashtu eshte e mundur te shtojme nje tabele ekzistuese si nje particion ne nje tabele te particionuar. Ka disa kufizime ne llojin e tabeles dhe te te dhenave qe mund te shtohen.
Komanda per shtimin e nje tabele si nje particion te nje tabele te particionuar eshte “alter table …. Switch…”.
Le te shtojme nje particion tek tabela MyPartitionedTable per particionin me vlere 3 dhe me pas te swap ate ne nje tabele te re MyNewPartition.
Per te shtuar nje particion te ri te MyPartitionedTable,perdor komanden ndarese ne funksjon te ndarjes.
ALTER PARTITION FUNCTION MyPartitionRange () split RANGE (3)
Kjo ka shtuar nje ndarje te re per vleren me 3 ndarje.
E kunderta e kesaj eshte te bashkoje nje varg
ALTER PARTITION FUNCTION MyPartitionRange () merge RANGE (3)
SELECT *
FROM sys.partitions
WHERE
OBJECT_ID = OBJECT_ID('MyPartitionedTable')
/*
partition_id object_id index_id partition_number hobt_id rows
-------------------- ----------- --------- ---------------- -------------------- ----
72057594042056704 322100188 0 1 72057594042056704 1
72057594042122240 322100188 0 2 72057594042122240 2
72057594042187776 322100188 0 4 72057594042187776 1
72057594042253312 322100188 0 3 72057594042253312 3
*/
Vini re ekzistencen e rreshtave te particionit me vleren 3 qe kane qene te te zhvendosura ne particionin 3. Reshtat me particionin me vleren 4 kane qene te zhvendosura ne particionin 4.
Ne krijuam nje tabele te re ku rame dakort per nje ndarje .Kjo tabele duhet te kete te njejten strukture ndarje.Ajo gjithashtu duhet te perfshije nje pengese kontrolli per te siguruar qe ndarja ne kolona dhe ne rreshta ne tabele te jene te perfshira ne nje ndarje korrekte.Kontrolli duhet te jete po aq kufizuhes te pakten si funksion varg ndares per particionin ndares.
CREATE TABLE MyNewPartition
(
i INT ,
s CHAR(8000) ,
PartCol INT CHECK (PartCol = 3 AND PartCol IS NOT NULL)
)
Une normalisht krijova dhe popullova tabele dhe shtova kontrollin te detyruar me vone.
Tani ne shtuam disa te dhena ne tabelen e re.
INSERT MyNewPartition SELECT 1, 'a', 3
Per te kryer kete operacjon ndarje ne duhet te lejme bosh kaq....
DELETE MyPartitionedTable WHERE PartCol = 3
Dhe ne mund te biem dakort me tabelen per ndarjet.
ALTER TABLE MyNewPartition switch TO MyPartitionedTable PARTITION 3
Shikojme ndarjet.
SELECT *
FROM
sys.partitions
WHERE OBJECT_ID = OBJECT_ID('MyPartitionedTable')
/*
partition_id object_id index_id partition_number hobt_id rows
-------------------- ----------- --------- ---------------- -------------------- ----
72057594042056704 322100188 0 1 72057594042056704 1
72057594042122240 322100188 0 2 72057594042122240 2
72057594042187776 322100188 0 4 72057594042187776 1
72057594042318848 322100188 0 3 72057594042318848 1
*/
Ne sapo pame ndarjet te cilat kane qene te swapped ne tabelen e re.
Avantazhi i kesaj eshte se swap nuk ka levizur te dhenat –ajo vetem updates the metadata ne menyre qe ne tabele te behet particioni. Kjo do te thote se ajo eshte shume e shpejte.Tabela mund te krijohet,popullohet,dhe mund te shtohen patricionet duke shkaktuar keshtu ndikimin minimal ne tabelen e ndare.
Switching nje particion i populluar.
Sigurisht nje particion qe eshte duke u tregtuar jasht shpesh do te permbaje shume informacione. – zakonisht kjo do te perdoret per te shtuar nje tjeter particion per te drejten per te ndare te dhenat.Per te fshire te dhenat nga particioninuk do te ishte e mundur – as nuk do te ndahet me nje particion te populluar.
Per te arritur kete,ju duhet ne fillim te populloni dy tabela per te zevendesuar 'catch all' particionet. (ne particionin 3, tone me skenar).
Tani krijoni nje tabele MyOld particioni 3 – Mos harroni kjo duhet te kete te njejten strukture si me siper.Pasi kjo eshte e destinuar per nje switch kontrolli konstant duhet te jete me pak kufizuese sesa ne tabelen me particione.
Tani dilni nga particioni.
ALTER TABLE MyPartitionedTable switch PARTITION
3 TO MyOldPartition3
Tani particioni i ndare mund te kryhet jashte nje nje particion bosh dhe dy particionet e mbyllur pa levizur nga te dhenat.
Identitete ne nje tabele te ndare.
Mos harroni se nje identitet nuk eshte i garantuar te jete unik apo vazhdues.Ajo vetem ndan vlerat e ardheshme nga pasardhesit e sotem.Me kete mendje asgje qe pason duhet te vije si surprize.
Per kete ne do te krijojme nje funksion te ri particioni,skeme dhe tabele.
CREATE PARTITION FUNCTION MyIdentityPartitionRange (INT)
AS RANGE LEFT FOR VALUES (1,2,3)
CREATE PARTITION SCHEME MyIdentityPartitionScheme AS
PARTITION MyIdentityPartitionRange
ALL TO ([PRIMARY])
CREATE TABLE MyIdentityPartitionedTable
(
i INT IDENTITY (1,1) ,
s CHAR(10) ,
PartCol INT
)
ON MyPartitionScheme (PartCol)
--And we add some data
INSERT MyIdentityPartitionedTable (s, PartCol) SELECT 'a', 1
INSERT MyIdentityPartitionedTable (s, PartCol) SELECT 'a', 2
INSERT MyIdentityPartitionedTable (s, PartCol) SELECT 'b', 1
INSERT MyIdentityPartitionedTable (s, PartCol) SELECT 'b', 2
SELECT * FROM MyIdentityPartitionedTable
i s PartCol
----------- ---------- -----------
1 a 1
3 b 1
2 a 2
4 b 2
Duke treguar se identiteti eshte nje prone e particionit te tabeles per me sakte si ndarje.
Me interesante eshte ajo qe ndodh kur particionet jane swapped:
CREATE TABLE MyIdentityPartitionedTableNew
(
i INT IDENTITY (1,1) ,
s CHAR(10) ,
PartCol INT CHECK (PartCol = 3 AND PartCol IS NOT NULL)
)
INSERT MyIdentityPartitionedTableNew (s, PartCol) SELECT 'c', 3
INSERT MyIdentityPartitionedTableNew (s, PartCol) SELECT 'd', 3
ALTER TABLE MyIdentityPartitionedTableNew
switch TO MyIdentityPartitionedTable PARTITION 3
SELECT * FROM MyIdentityPartitionedTable
i s PartCol
----------- ---------- -----------
1 a 1
3 b 1
2 a 2
4 b 2
1 c 3
2 d 3
Dhe ne e shohim te kopjuara vlerat e particionit te ri.
Duke shtuar nje rreshti te ri.
INSERT MyIdentityPartitionedTable (s, PartCol) SELECT 'e', 1
SELECT * FROM MyIdentityPartitionedTable
i s PartCol
----------- ---------- -----------
1 a 1
3 b 1
5 e 1
2 a 2
4 b 2
1 c 3
2 d 3
Ne shohim se particioni swap nuk ka ndikuar fare ne identitetin e tabeles.
Particioni tabeles dhe Indexes.
Ne qofte se indexi permban kolonen e ndarjes atehere indexi eshte i referuar si "nje linje" me tabelen.
Ne qofte se indeksi perdor te njejten particion skeme me tabelen dhe eshte ne nje filegroup atehere indexi duhet te jete ne linje me tabelen.
Per nje tregues jo unik indexi i kolones ndarese mund te prefshi per te lidhur indexin ne vende te sapo indexura.
Une mendoj se eshte me mire gjithmone ne menyre eksplicite te perfshi kolonen e ndarjes ne indexet tuaja.
Ne vazhdimesi merrni nje skeme dhe filegroup te vetem.
Indeksi Clustered
Sic u tha me kete index duhet te jete ne nje linje me tabelen.Nese nuk eshte atehere ne kolonen e ndarjes do te shtohen sigurisht kolona e perfundimtare e indexit.
CREATE PARTITION FUNCTION MyPartitionRange (INT)
AS RANGE LEFT FOR VALUES (1,2,3)
CREATE PARTITION SCHEME MyPartitionScheme AS
PARTITION MyPartitionRange
ALL TO ([PRIMARY])
CREATE TABLE MyPartitionedTable
(
i INT ,
j INT ,
s VARCHAR(MAX) ,
PartCol INT
)
ON MyPartitionScheme (PartCol)
CREATE TABLE MyNewPartition
( i INT ,
j INT ,
s VARCHAR(MAX) ,
PartCol INT CHECK (PartCol = 3 AND PartCol IS NOT NULL)
)
CREATE CLUSTERED INDEX cl_ix ON MyPartitionedTable (j)
CREATE CLUSTERED INDEX cl_ix ON MyNewPartition (j)
ALTER TABLE MyNewPartition switch TO MyPartitionedTable PARTITION 3
....jep gabimin...
ALTER TABLE SWITCH statement failed. There is no identical index in source table 'tempdb.dbo.MyNewPartition' for the index 'cl_ix' in target table 'tempdb.dbo.MyPartitionedTable' .
ndonese te gjitha paten sukses.
DROP INDEX MyNewPartition.cl_ix
DROP INDEX MyPartitionedTable.cl_ix
CREATE CLUSTERED INDEX cl_ix ON MyPartitionedTable (j, PartCol)
CREATE CLUSTERED INDEX cl_ix ON MyNewPartition (j, PartCol)
ALTER
TABLE MyNewPartition switch TO MyPartitionedTable PARTITION 3
DROP INDEX MyNewPartition.cl_ix
DROP INDEX MyPartitionedTable.cl_ix
CREATE CLUSTERED INDEX cl_ix ON MyPartitionedTable (PartCol, j)
CREATE CLUSTERED indeex cl_ix ON MyNewPartition (PartCol, j)
ALTER TABLE MyNewPartition switch TO MyPartitionedTable PARTITION 3
Edhe kjo do te punoje.
DROP INDEX MyNewPartition.cl_ix
DROP INDEX MyPartitionedTable.cl_ix
CREATE CLUSTERED INDEX cl_ix
ON MyPartitionedTable (j)
CREATE CLUSTERED INDEX cl_ix ON MyNewPartition (j, PartCol)
...tregon se kolona ndarese ka qene shtuar ne indexin ne tabelen e ndare.
Vini re se kjo kolone e shtuar nuk do te tregohet nga ...... ne tabelen e ndare as nga scripting index por ajo eshte e treguar ne ... sys.index_columns
Nuk e di perse Microsoft vendosi te shtoje nje kolone indexi automatikisht.Une mendoj se do te jete me pak konfuze per te dhene gabimin,duke e detyruar perdoruesin te shtoje kolone ne espilicite.
Indexi Unique.
Indexi unik permban kolonen e ndarse si kolone te indexuar.
CREATE PARTITION FUNCTION MyPartitionRange (INT)
AS RANGE LEFT FOR VALUES (1,2,3)
CREATE PARTITION SCHEME MyPartitionScheme AS
PARTITION MyPartitionRange
ALL TO ([PRIMARY])
CREATE TABLE MyPartitionedTable
( i INT ,
j INT ,
s VARCHAR(MAX) ,
PartCol INT
)
ON MyPartitionScheme (PartCol)
CREATE TABLE MyNewPartition
(
i INT ,
j INT ,
s VARCHAR(MAX) ,
PartCol INT CHECK (PartCol = 3
AND PartCol IS NOT NULL)
)
CREATE UNIQUE INDEX cl_ix ON MyPartitionedTable (j)
...jep gabimin
Msg 1908, Level 16, State 1, Line 1 olumn 'PartCol' is partitioning
column of the index 'cl_ix'. Partition columns for a unique index must
be a subset of the index key.
…nje nga shume shpjegues per mesazhet e gabuara.
Kolona e ndarjse duhet te jete pjese e indexit ne kete menyre..
CREATE UNIQUE INDEX cl_ix ON MyPartitionedTable (j) include (PartCol)
…do te deshtoje gjithashtu
Ndryshe nga indexet e grumbulluara kolona e ndarjes do te jete ne menyre eksplicite pjese e indexit.
Keto do te punojne se bashku.
CREATE UNIQUE INDEX cl_ix ON MyPartitionedTable (j, PartCol)
CREATE UNIQUE INDEX cl_ix
ON MyPartitionedTable (j, PartCol)
ALTER TABLE MyNewPartition switch TO MyPartitionedTable PARTITION 3
CREATE UNIQUE INDEX cl_ix ON MyPartitionedTable (PartCol , j)
CREATE UNIQUE INDEX cl_ix ON MyPartitionedTable (PartCol , j)
ALTER TABLE MyNewPartition switch TO MyPartitionedTable PARTITION 3
Indexi jo unik.
Indexi jo unik nuk duhet te kete kolona ndarese si pjese te indexit,ajo mund te kete nje kolone PERFSHIJ. Ne qoftese kjo nuk eshte perfshire ne menyre eksplicite,atehere kolona do te shtohet automatikisht – perseri kjo nuk do te shfaqet ne sp_helpindex
CREATE PARTITION FUNCTION MyPartitionRange (INT)
AS
RANGE LEFT FOR VALUES (1,2,3)
CREATE PARTITION SCHEME MyPartitionScheme AS
PARTITION MyPartitionRange
ALL TO ([PRIMARY])
CREATE TABLE MyPartitionedTable
(
i INT ,
j INT ,
s VARCHAR(MAX) ,
PartCol INT
)
ON MyPartitionScheme (PartCol)
CREATE TABLE MyNewPartition
(
i INT ,
j INT ,
s VARCHAR(MAX) ,
PartCol INT CHECK (PartCol = 3 AND PartCol IS NOT NULL)
)
CREATE INDEX cl_ix ON MyPartitionedTable (j)
CREATE INDEX cl_ix ON MyNewPartition (j) include (PartCol)
ALTER TABLE MyNewPartition switch TO MyPartitionedTable PARTITION 3
Sic jane..eshte i sukseshem...
CREATE INDEX cl_ix ON MyPartitionedTable (j, PartCol)
CREATE INDEX cl_ix ON MyNewPartition (j, PartCol)
ALTER TABLE MyNewPartition switch TO MyPartitionedTable PARTITION 3
CREATE INDEX cl_ix ON MyPartitionedTable (PartCol, j)
CREATE INDEX cl_ix ON MyNewPartition (PartCol, j)
ALTER TABLE MyNewPartition switch TO MyPartitionedTable PARTITION 3
Skenaret
Ndarja ne kolona te shumta.
Edhe pse kolona e ndarjes duhet te jete nje kolone e vetme,ajo nuk ka nevoje te jete numerike , kjo mund te llogaritet ne menyre qe te mund te perfshihen kolona te shumta.Per shembull eshte e zakonshme ndarja ne datime te te dhenave sipas muajit. Kjo do te punoje shume mire, sepse ato te dhena zakonisht jane ne nje kolone te vetme,por cfare do te benit ju nese do te kishit te dhena te shumta nga kompania juaj dhe ju do deshironi particion nga kompania? Per kete ju mund te perdorni kolonen e llogaritur per ndarjen e saj.Kjo do te krijoje kolenen e llogaritur duke perdorur "ID e kompanise" dhe "Porosi muaji"e cila eshte perdorur me pas per ndarje.Ajo do te ndaje tre kompani per tre muajt e pare te 2007.
CREATE PARTITION FUNCTION MyPartitionRange (INT)
AS RANGE LEFT FOR VALUES
(1200701,1200702,1200703,2200701,2200702,2200703,3200701,3200702,3200703)
CREATE PARTITION SCHEME MyPartitionScheme AS
PARTITION MyPartitionRange
ALL TO ([PRIMARY])
CREATE TABLE CompanyOrders
(
Company_id INT ,
OrderDate datetime ,
Item_id INT ,
Quantity INT ,
OrderValue decimal(19,5) ,
PartCol AS Company_id * 10000 + CONVERT(VARCHAR(4),OrderDate,112) persisted
)
ON MyPartitionScheme (PartCol)
Kolona e llogaritur duhet te jete "Vazhdoi" per te vazhduar kolonen e ndarjes.
Me vone ne do te hetojme ne ruajtjen e te dhenave te ndara ne kete table..
Te dhenat mujore – varg rreshqitje.
Nje kerkese e perbashket eshte ndarja ne muaj. Kjo do te thote se ndarja e muajit te ri duhet te jete shtuar dhe mundesisht te dhenat e vjetra ne ndarese te jene fshire.Une do ta preshkruaj procesin e shtimit te nje ndarje te dhenash me pas,per te hequr nje ndarje procesi qe eshte i njejte ju bie dakort me nga dy ndarje,bashkojme vargun dhe e shkembejme ne tabelen e vetme.
Ne krijuam nje ndarese tabele per te dhenat mujore by OrderDate
CREATE PARTITION FUNCTION MyPartitionRange (datetime)
AS RANGE RIGHT FOR VALUES ('20070101', '20070201', '20070301', '20070401')
CREATE PARTITION SCHEME MyPartitionScheme AS
PARTITION MyPartitionRange
ALL TO ([PRIMARY])
CREATE TABLE Orders
(
OrderDate datetime ,
Item_id INT ,
Quantity INT ,
OrderValue decimal(19,5)
)
ON MyPartitionScheme (OrderDate)
Kjo do t'ju japi kater ndarje....
OrderDate < '20070101'
OrderDate >= '20070101' AND < '20070201'
OrderDate >= '20070201' AND < '20070301'
OrderDate >= '20070301' AND < '20070401'
OrderDate >= '20070401'
Ka te dhena se te parat do te ndahen ne ndarese muaji.
Dhe ne do te fusim disa te dhena prove.
--insert Orders select '19000101', 1, 1, 1
INSERT Orders SELECT '20070101', 1, 1, 1
INSERT Orders SELECT '20070201', 1, 1, 1
INSERT Orders SELECT '20070301', 1, 1, 1
INSERT Orders SELECT '20070401', 1, 1, 1
INSERT Orders SELECT '20070402', 1, 1, 1
INSERT Orders SELECT '20070501', 1, 1, 1
Per te shtuar ndarjen e muajit te ardhshem eshte e mundur vetem ta lejme te ndare ne varg dhe me pas punen e ben vet sistemi i cili kujdeset per te dhenat. Kjo edhe pse do te thote se te dhenat do te ishin off-line per sa kohe do te zgjaste operacjoni.Eshte me mire te perdorim eksperiencat qe kemi fituar ne switching ndareset per te krijuar te dhena te reja ne tabela pastaj kaloni ne to.Kjo do te thote se ne tabele do te dali off-line per nje kohe te shkurter vetem derisa operacjoni te jete duke u zhvilluar.
Nese te dhenat jane duke u shtuar vazhdimisht ne tabelen e paraqitur, tabela te reja pergatiten per kete dhe operacionit switch i duhet te mbaje tabelen off-line, te bashkoje te dhena te reja me te dhenat e meparshme me pas te kryeje switch-in. Nje kolone e ngjashme ne tabele do tju ndihmoje ju te identifikoni te dhena te reja qe nga casti i fotografuar.Kjo do te thote jo shume produktive per te dhena statike por akoma me pak se ndarjen e nje game te populluar.
Per te shtuar nje ndarje mujore me te dhena statike
Krijo tabele qe permban te dhena te reja mujore.
Krijo tabele qe permban te dhena pas muajit te ri.
Bi dakort nga muaji i kaluar nga tabela e ndare.
Ndaj (bosh) ne tabelen e ndare, varg.
Ndaj te rejat mujore.
Ndaj ne tabelen qe permban te dhenat pas muajit te ri.
Kontrollo rezultatin.
1. Krijo tabele qe permban te dhenat e reja mujore.
Ne fillim te diskutimit ne krijuam nje tabele per kete,por ju mund te gjeni me lehte te krijoni nje ndarje tabele per kete operacjon.
Vini re, ne qoftese ju shkruani tabelen qe ekziston dhe indexet, sigurohuni te mbani mend se jo te gjitha kolonat e indexuara mund te duken ne shkrimin index.
Gjithashtu nese ju merni kete rruge do te keni per te perdorur nje funksion te ri dhe skeme ju duhet ta ndani ne varg.Une preferoj te perdor tabelat jo-ndarese per fleksibilitet.
Per te populluar tabelen duhet te dihet se ku jane vendosur te dhenat pasi do te jete i vetmi efekt per te stimuluar tabelen nese ju duhet te lexoni te dhenat nga ajo tabele.
CREATE TABLE Orders_200704
(
OrderDate datetime CHECK (OrderDate >= '20070401'
AND OrderDate < '20070501' AND OrderDate IS NOT NULL) ,
Item_id INT ,
Quantity INT ,
OrderValue decimal(19,5)
)
INSERT Orders_200704 SELECT * FROM Orders WHERE OrderDate >= '20070401 AND OrderDate < '20070501'
2.Krijoni tabele qe te permbaje te dhenat pasardhese te muajit te ri.
Ne te njejten menyre si tabela e meparshme populluar me te dhenat keshtu qe eshte me vone se muaji i ri.
CREATE TABLE
Orders_200705
(
OrderDate datetime CHECK (OrderDate >= '20070501' AND OrderDate
IS NOT NULL) ,
Item_id INT ,
Quantity INT ,
OrderValue decimal(19,5)
)
INSERT Orders_200705 SELECT * FROM Orders WHERE OrderDate >= '20070501'
Ne kete pike kemi paraqitjen e tabeles te shkembimit off-line.
3.Shkembe nga dalja e muajit te kaluar sipas ndarjes se tabeles.
Per kete juve ju duhet nje tabele boshe per te shkembyer te dhenat ne te.Eshte perseri tunduese te perdorim tabelen e ndare per kete - pra juve ju duhet te krijoni nje funksion te ri particioni ndarje dhe skeme pasi ju nuk do te donit te humbisni te dhenat derisa te percahet vargu ne paraqitjen e tabeles.
CREATE TABLE
Orders_200704_Old
(
OrderDate datetime CHECK (OrderDate >= '20070401'
AND OrderDate IS NOT NULL) ,
Item_id INT ,
Quantity INT ,
OrderValue decimal(19,5)
)
ALTER TABLE Orders switch PARTITION 5 TO Orders_200704_Old
4. Ndarje (bosh) varg ne tabelen e ndare.
Kjo eshte bere duke shtuar nje vlere te re ne funksion ndarje.
ALTER PARTITION FUNCTION MyPartitionRange () split RANGE ('20070501')
Si ndarje kjo eshte bosh , duhet te jete e shpejte thjesht do te thote duke krijuar nje particion te ri bosh.
5 Bie dakort me te dhenat e reja mujore.
ALTER TABLE Orders_200704 switch TO Orders PARTITION 5
6 Bie dakort me te dhenat qe permban muaji pasardhes.
ALTER TABLE Orders_200705 switch TO Orders PARTITION 6
7 Kontrollo rezultatin.
SELECT *
FROM sys.partitions
WHERE OBJECT_ID = OBJECT_ID('Orders')
Jep rezultatin e pritur
partition_id object_id index_id partition_number hobt_id rows
-------------------- ----------- --------- ---------------- -------------------- ----
72057594038845440 213575799 0 1 72057594038845440 1
72057594038910976 213575799 0 2 72057594038910976 1
72057594038976512 213575799 0 3 72057594038976512 1
72057594039042048 213575799 0 4 72057594039042048 1
72057594039173120 213575799 0 5 72057594039173120 2
72057594039238656 213575799 0 6 72057594039238656 1
Tani tabela Orders_200704_Old mund te bie ne kohe te lire.
Shtimi i nje particioni te ri me nje funksion te llogaritur ndarje.
Ne kthehemi ne tabelen e ndare nga kompania dhe muaj.
CREATE PARTITION FUNCTION MyPartitionRange (INT)
AS RANGE LEFT FOR VALUES
(1200701,1200702,1200703,2200701,2200702,2200703,3200701,3200702,3200703)
CREATE PARTITION SCHEME MyPartitionScheme AS
PARTITION MyPartitionRange
ALL TO ([PRIMARY])
CREATE TABLE CompanyOrders
(
Company_id INT ,
OrderDate datetime ,
Item_id INT ,
Quantity INT ,
OrderValue decimal(19,5) ,
PartCol AS Company_id * 10000 + CONVERT(VARCHAR(4),OrderDate,112) persisted
)
ON MyPartitionScheme (PartCol)
Ne menyre qe te shtojme nje muaj te ri ne tabele,ju do t'ju duhet te ndani cdo kompani nga vargu per ate muaj.Per te shtuar nje particion kompanie duhet percani te gjithe muajt nga ajo kompani.
Nuk ka nevoje te shtoni te gjitha particionet ne nje proces,ku operacion mund te kryhet nje ndarje ne nje kohe.Kjo nuk duhet te ndikoje ne rezultatet e pyetjeve ne tabele.
Procesi per te shtuar nje compani te re ose muaj eshte e njejte si per te dhenat e levizshme mujore, vetem me me shume ndarje dhe shkembime.