Partitioned Tables

Έχουν δημοσιευτεί 10 Νοεμβρίου 05 10:19 πμ | KelMan 

Technorati Tags:
Στην προηγούμενη έκδοση του SQL Server είχαμε τα partitioned views μέσω των οποίων μπορούσαμε να δούμε πολλαπλούς πίνακες, ενδεχομένως σε διαφορετικούς servers, ως ένα ενιαίο σύνολο. Σε αυτήν την έκδοση μπορούμε να έχουμε σε partionions τον ίδιο τον πίνακα.

Το partitioning γίνεται οριζόντια δηλαδή ένα διαφορετικό set από εγγραφές υπάρχει σε κάθε partition και κάθε ένα από αυτούς κατοικοεδρεύει σε διαφορετικό filegroup.

To πλεονέκτημα είναι ότι είναι ευκολότερη η διαχείριση πινάκων μεγάλου όγκου δεδομένων αφού οι ενέργειες που κάνουμε περιορίζονται μόνο στους πίνακες που αφορούν.

Επίσης, ο query optimizer όταν τρέχει σε συστήματα με 8 επεξεργαστές και άνω, μπορεί να προσαρμόζει το execution plan ώστε να εκτελούνται παράλληλα queries στα partitions.


Πως γίνεται η δουλειά

Αρχικά χρειαζόμαστε ένα PARTITION FUNCTION. Αυτό καθορίζει ποια data πάνε σε ποιό partition.

[code language="T-SQL"]
CREATE PARTITION FUNCTION OrderDatePF (datetime)
AS RANGE LEFT FOR VALUES ('1/1/1997', '1/1/1998')
[/code]

Δηλαδή θα σπάσουμε τον πίνακα Orders σε τρεις ομάδες μία ως (προσοχή, όχι «ως και» - RANGE RIGHT) 1/1/1997, μία  από 1/1/1997 ως 1/1/1998 και μία από 1/1/1998 ως σήμερα

Κατόπιν, χρειαζόμαστε ένα PARTITION SCHEME το οποίο θα αντιστοιχήσει τα table partitions σε ανάλογα filegroups

[code language="T-SQL"]
CREATE PARTITION SCHEME OrderDatePS
AS PARTITION OrderDatePF TO (filegroup1, filegroup2, filegroup3)
[/code]

Και τέλος φτιάχνουμε τον πίνακα που θα γίνει partitioned

[code language="T-SQL"]
CREATE TABLE OrdersHistory(
                OrderID int PRIMARY KEY,
                CustomerID nchar(5),
                EmployeeID int ,
                OrderDate datetime ,
                RequiredDate datetime ,
                ShippedDate datetime ,
                ShipVia int ,
                Freight money ,
                ShipName nvarchar(40) ,
                ShipAddress nvarchar(60) ,
                ShipCity nvarchar(15) ,
                ShipRegion nvarchar(15),
                ShipPostalCode nvarchar(10) ,
                ShipCountry nvarchar(15))
ON OrderDatePS(OrderDate)
[/code]

Αν θα τρέξετε το παραπάνω όμως δεν θα παίξει… Θα πρέπει να το αλλάξετε να γίνει έτσι:

[code language="T-SQL"]
CREATE TABLE OrdersHistory(
                OrderID int ,
                CustomerID nchar(5),
                EmployeeID int ,
                OrderDate datetime ,
                RequiredDate datetime ,
                ShippedDate datetime ,
                ShipVia int ,
                Freight money ,
                ShipName nvarchar(40) ,
                ShipAddress nvarchar(60) ,
                ShipCity nvarchar(15) ,
                ShipRegion nvarchar(15),
                ShipPostalCode nvarchar(10) ,
                ShipCountry nvarchar(15),
CONSTRAINT PK_OrdersHist PRIMARY KEY CLUSTERED
(
                OrderID ASC,
                OrderDate
))
ON OrderDatePS(OrderDate)
[/code]

Το πιάσατε το κόλπο;

Εδώ η δουλειά έχει τελειώσει. Μένει να τον γεμίσουμε:

[code language="T-SQL"]
INSERT INTO OrdersHistory
SELECT * FROM Orders
[/code]

Και πλέον μπορούμε να τρέξουμε τα query μας.

[code language="T-SQL"]
SELECT OrderID, $partition.OrderDatePF(OrderDate) Partition
FROM OrdersHistory
[/code]

Αυτό το [code language="T-SQL"]$partition.OrderDatePF(OrderDate)[/code] τι είναι; Ένα function που μας επιστρέφει τον αριθμό του partition που βρίσκεται το row…

Το ωραίο της υπόθεσης το άφησα για το τέλος… Η λύση αυτή διαφέρει πολύ σε σχέση με το να κάνει κάποιος το ίδιο σενάριο χειροκίνητα και να συντηρεί τους πίνακες με triggers ή με INSERT INTO SELECT FROM statements. Με το νέο τρόπο, είναι ταχύτατη η μεταφορά δεδομένων από partition σε partition γιατί τα data δεν μεταφέρονται «φυσικά» αλλά απλώς αλλάζουν τα metadata που έχουν να κάνουν με την τοποθεσία αποθήκευσης…

Δημοσίευση στην κατηγορία:

Σχόλια:

Χωρίς Σχόλια
Έχει απενεργοποιηθεί η προσθήκη σχολίων από ανώνυμα μέλη

Search

Go

Συνδρομές