SQL सर्वर में, विभाजन स्विचिंग आपको बड़ी मात्रा में डेटा को तालिका में या बाहर बहुत तेज़ी से लोड करने की अनुमति देता है। यह आपको डिलीट या इंसर्ट स्टेटमेंट चलाने से बचाता है, और बड़े डेटा सेट के साथ काम करते समय बहुत उपयोगी हो सकता है।
आप ALTER TABLE
. का उपयोग कर सकते हैं किसी पार्टीशन को टेबल के अंदर या बाहर स्विच करने के लिए स्टेटमेंट।
किसी पार्टीशन को टेबल से बाहर स्विच करने के लिए, कोड इस प्रकार है:
ALTER TABLE Table1
SWITCH PARTITION x TO Table2
यह विभाजन को स्विच करता है x
Table1
. से से Table2
(जहां x
विभाजन संख्या है)।
उदाहरण
सेटअप
इससे पहले कि हम स्विच आउट करना शुरू करें, हम मूल सेटअप तैयार करेंगे। इसमें दो टेबल होंगे। एक विभाजित स्रोत तालिका होगी, दूसरी गंतव्य तालिका होगी। हम चार फ़ाइल समूह भी बनाएंगे - प्रत्येक विभाजन के लिए एक।
-- Create filegroups
ALTER DATABASE Test ADD FILEGROUP OrdersLatestFg1;
GO
ALTER DATABASE Test ADD FILE (
NAME = OrdersLatestFg1dat,
FILENAME = '/var/opt/mssql/data/OrdersLatestFg1dat.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB
)
TO FILEGROUP OrdersLatestFg1;
GO
ALTER DATABASE Test ADD FILEGROUP OrdersLatestFg2;
GO
ALTER DATABASE Test ADD FILE (
NAME = OrdersLatestFg2dat,
FILENAME = '/var/opt/mssql/data/OrdersLatestFg2dat.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB
)
TO FILEGROUP OrdersLatestFg2;
GO
ALTER DATABASE Test ADD FILEGROUP OrdersLatestFg3;
GO
ALTER DATABASE Test ADD FILE (
NAME = OrdersLatestFg3dat,
FILENAME = '/var/opt/mssql/data/OrdersLatestFg3dat.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB
)
TO FILEGROUP OrdersLatestFg3;
GO
ALTER DATABASE Test ADD FILEGROUP OrdersLatestFg4;
GO
ALTER DATABASE Test ADD FILE (
NAME = OrdersLatestFg4dat,
FILENAME = '/var/opt/mssql/data/OrdersLatestFg4dat.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB
)
TO FILEGROUP OrdersLatestFg4;
GO
-- Create a partition function that will result in four partitions
CREATE PARTITION FUNCTION OrdersLatestPartitionFunction (date)
AS RANGE RIGHT FOR VALUES (
'20200201',
'20200301',
'20200401'
);
GO
-- Create a partition scheme that maps the partitions to the filegroups
CREATE PARTITION SCHEME OrdersLatestPartitionScheme
AS PARTITION OrdersLatestPartitionFunction
TO (
OrdersLatestFg1,
OrdersLatestFg2,
OrdersLatestFg3,
OrdersLatestFg4
);
GO
-- Create a partitioned table called OrdersLatest that uses the OrderDate column as the partitioning column
CREATE TABLE OrdersLatest (
OrderDate date NOT NULL,
OrderId int IDENTITY NOT NULL,
OrderDesc varchar(255) NOT NULL,
CONSTRAINT PKOrdersLatest PRIMARY KEY CLUSTERED(OrderDate, OrderId)
)
ON OrdersLatestPartitionScheme(OrderDate);
GO
-- Insert data into the OrdersLatest table.
-- This will end up in partition 3, which is the partition we will switch out to the OrdersMarch table.
INSERT INTO OrdersLatest(OrderDate, OrderDesc) VALUES
('20200302', 'Cat food'),
('20200315', 'Water bowl'),
('20200318', 'Saddle for camel'),
('20200321', 'Dog biscuits'),
('20200328', 'Bigfoot shoes');
GO
-- Create a table that contains the data that we will be switching out to.
-- Note that the filegroup matches the filegroup of the partition that we will switch out of.
CREATE TABLE OrdersMarch (
OrderDate date NOT NULL,
OrderId int IDENTITY NOT NULL,
OrderDesc varchar(255) NOT NULL,
CONSTRAINT PKOrdersMarch PRIMARY KEY CLUSTERED(OrderDate, OrderId)
)
ON OrdersLatestFg3;
GO
-- Check how many rows are in each table
SELECT COUNT(*) AS OrdersLatest
FROM OrdersLatest;
SELECT COUNT(*) AS OrdersMarch
FROM OrdersMarch;
परिणाम:
+----------------+ | OrdersLatest | |----------------| | 5 | +----------------+ +---------------+ | OrdersMarch | |---------------| | 0 | +---------------+
तो जैसा कि यह वर्तमान में खड़ा है, हमारे पास OrdersLatest
. में पाँच पंक्तियाँ हैं तालिका, जो हमारी विभाजित तालिका है।
सभी पाँच पंक्तियाँ विभाजन 3 में होनी चाहिए। आइए इसकी जाँच करें।
SELECT
p.partition_number AS [Partition],
fg.name AS [Filegroup],
p.Rows
FROM sys.partitions p
INNER JOIN sys.allocation_units au
ON au.container_id = p.hobt_id
INNER JOIN sys.filegroups fg
ON fg.data_space_id = au.data_space_id
WHERE p.object_id = OBJECT_ID('OrdersLatest')
ORDER BY [Partition];
परिणाम:
+-------------+-----------------+--------+ | Partition | Filegroup | Rows | |-------------+-----------------+--------| | 1 | OrdersLatestFg1 | 0 | | 2 | OrdersLatestFg2 | 0 | | 3 | OrdersLatestFg3 | 5 | | 4 | OrdersLatestFg4 | 0 | +-------------+-----------------+--------+
हाँ, इसलिए हम देख सकते हैं कि सभी पाँच पंक्तियाँ विभाजन 3 में हैं। हम यह भी देख सकते हैं कि विभाजन 3 को OrdersLatestFg3
में मैप किया गया है। फ़ाइल समूह हमारे "स्विच आउट" के सफल होने के लिए, हमें यह सुनिश्चित करने की आवश्यकता है कि हमारी गंतव्य तालिका इस फ़ाइल समूह का उपयोग करती है। सौभाग्य से, हमारा उपरोक्त कोड ठीक यही करता है। हमने ON OrdersLatestFg3
. का इस्तेमाल किया तालिका बनाते समय यह निर्दिष्ट करने के लिए कि उस फ़ाइल समूह पर तालिका बनाई जानी चाहिए।
स्विच आउट
ठीक है, तो सब कुछ स्विच आउट करने के लिए तैयार है। चलो करते हैं।
ALTER TABLE OrdersLatest
SWITCH PARTITION 3 TO OrdersMarch;
परिणाम:
Commands completed successfully.
उत्कृष्ट। हमारा स्विच आउट काम कर गया।
आइए प्रत्येक तालिका में पंक्तियों की संख्या फिर से जांचें।
SELECT COUNT(*) AS OrdersLatest
FROM OrdersLatest;
SELECT COUNT(*) AS OrdersMarch
FROM OrdersMarch;
परिणाम:
+----------------+ | OrdersLatest | |----------------| | 0 | +----------------+ +---------------+ | OrdersMarch | |---------------| | 5 | +---------------+
इसलिए हम देख सकते हैं कि डेटा को OrdersLatest
. से स्थानांतरित कर दिया गया है OrdersMarch
. के लिए तालिका टेबल।
आइए OrdersLatest
के लिए विभाजन जानकारी देखें ।
SELECT
p.partition_number AS [Partition],
fg.name AS [Filegroup],
p.Rows
FROM sys.partitions p
INNER JOIN sys.allocation_units au
ON au.container_id = p.hobt_id
INNER JOIN sys.filegroups fg
ON fg.data_space_id = au.data_space_id
WHERE p.object_id = OBJECT_ID('OrdersLatest')
ORDER BY [Partition];
परिणाम:
+-------------+-----------------+--------+ | Partition | Filegroup | Rows | |-------------+-----------------+--------| | 1 | OrdersLatestFg1 | 0 | | 2 | OrdersLatestFg2 | 0 | | 3 | OrdersLatestFg3 | 0 | | 4 | OrdersLatestFg4 | 0 | +-------------+-----------------+--------+
जैसा अपेक्षित था, OrdersLatestFg3
विभाजन अब खाली है। ऐसा इसलिए है क्योंकि इसे बंद कर दिया गया है।
आइए OrdersMarch
. के लिए विभाजन जानकारी देखें टेबल।
SELECT
p.partition_number AS [Partition],
fg.name AS [Filegroup],
p.Rows
FROM sys.partitions p
INNER JOIN sys.allocation_units au
ON au.container_id = p.hobt_id
INNER JOIN sys.filegroups fg
ON fg.data_space_id = au.data_space_id
WHERE p.object_id = OBJECT_ID('OrdersMarch')
ORDER BY [Partition];
परिणाम:
+-------------+-----------------+--------+ | Partition | Filegroup | Rows | |-------------+-----------------+--------| | 1 | OrdersLatestFg3 | 5 | +-------------+-----------------+--------+
जैसा कि अपेक्षित था, ऑर्डरमार्च तालिका में पाँच पंक्तियाँ हैं। वे OrdersLatest3
. पर विभाजन 1 (एकमात्र विभाजन) में संग्रहीत हैं फ़ाइल समूह।
स्विच इन
किसी पार्टीशन में स्विच-इन करने के तरीके के लिए SQL सर्वर में स्विच-इन पार्टिशन देखें।