Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर में स्विच-इन एक विभाजन (T-SQL)

SQL सर्वर में, आप पार्टीशन को पार्टीशन टेबल के अंदर और बाहर स्विच कर सकते हैं।

आप इसे ALTER TABLE . के साथ कर सकते हैं बयान। मूल रूप से, यह इस प्रकार है:

ALTER TABLE OldTable
SWITCH TO NewTable PARTITION x

यह OldTable . के लिए विभाजन को बदल देता है विभाजन में x NewTable . का (जहां x विभाजन संख्या है)।

उदाहरण

इससे पहले कि हम स्विच इन करना शुरू करें, आइए दो टेबल सेट करें। एक (जिसे OrdersOld कहा जाता है ) में वह डेटा होगा जिसे हम दूसरी तालिका में "स्विच इन" करना चाहते हैं (जिसे OrdersNew कहा जाता है) )

हम विभाजन करेंगे OrdersNew चार विभाजनों में।

-- Create filegroups
ALTER DATABASE Test ADD FILEGROUP OrdersNewFg1;
GO

ALTER DATABASE Test ADD FILE (  
    NAME = OrdersNewFg1dat,  
    FILENAME = '/var/opt/mssql/data/OrdersNewFg1dat.ndf',  
    SIZE = 5MB,  
    MAXSIZE = 100MB,  
    FILEGROWTH = 5MB
    )  
TO FILEGROUP OrdersNewFg1;
GO

ALTER DATABASE Test ADD FILEGROUP OrdersNewFg2;
GO

ALTER DATABASE Test ADD FILE (  
    NAME = OrdersNewFg2dat,  
    FILENAME = '/var/opt/mssql/data/OrdersNewFg2dat.ndf',  
    SIZE = 5MB,  
    MAXSIZE = 100MB,  
    FILEGROWTH = 5MB
    )  
TO FILEGROUP OrdersNewFg2;
GO
ALTER DATABASE Test ADD FILEGROUP OrdersNewFg3;
GO

ALTER DATABASE Test ADD FILE (  
    NAME = OrdersNewFg3dat,  
    FILENAME = '/var/opt/mssql/data/OrdersNewFg3dat.ndf',  
    SIZE = 5MB,  
    MAXSIZE = 100MB,  
    FILEGROWTH = 5MB
    )  
TO FILEGROUP OrdersNewFg3;
GO
ALTER DATABASE Test ADD FILEGROUP OrdersNewFg4;
GO

ALTER DATABASE Test ADD FILE (  
    NAME = OrdersNewFg4dat,  
    FILENAME = '/var/opt/mssql/data/OrdersNewFg4dat.ndf',  
    SIZE = 5MB,  
    MAXSIZE = 100MB,  
    FILEGROWTH = 5MB
    )  
TO FILEGROUP OrdersNewFg4;
GO

-- Create a partition function that will result in four partitions  
CREATE PARTITION FUNCTION OrdersNewPartitionFunction (date)  
    AS RANGE RIGHT FOR VALUES (
        '20200201', 
        '20200301',
        '20200401'
    );
GO

-- Create a partition scheme that maps the partitions to the filegroups
CREATE PARTITION SCHEME OrdersNewPartitionScheme
    AS PARTITION OrdersNewPartitionFunction  
    TO (
        OrdersNewFg1,
        OrdersNewFg2,
        OrdersNewFg3,
        OrdersNewFg4
        );  
GO

-- Create a table that contains the data that we will be switching in.  
-- Note that the filegroup matches the filegroup of the partition that we will switch in to.
-- Include CHECK constraint to restrict data to the range specified in the switch-in partition
CREATE TABLE OrdersOld (
    OrderDate date NOT NULL,
    OrderId int IDENTITY NOT NULL,
    OrderDesc varchar(255) NOT NULL,
    CONSTRAINT chkDate CHECK (OrderDate >= '20200301' AND OrderDate < '20200401'),
    CONSTRAINT PKOrdersOld PRIMARY KEY CLUSTERED(OrderDate, OrderId)
    )
    ON OrdersNewFg3;
GO

-- Insert data into the OrdersOld table. This is the data we will be switching in to the OrdersNew table.
INSERT INTO OrdersOld(OrderDate, OrderDesc) VALUES
    ('20200302', 'Cat food'),
    ('20200315', 'Water bowl'),
    ('20200318', 'Saddle for camel'),
    ('20200321', 'Dog biscuits'),
    ('20200328', 'Bigfoot shoes');
GO

-- Create a partitioned table called OrdersNew that uses the OrderDate column as the partitioning column
CREATE TABLE OrdersNew (
    OrderDate date NOT NULL,
    OrderId int IDENTITY NOT NULL,
    OrderDesc varchar(255) NOT NULL,
    CONSTRAINT PKOrdersNew PRIMARY KEY CLUSTERED(OrderDate, OrderId)
    )  
    ON OrdersNewPartitionScheme (OrderDate);  
GO

-- Check how many rows are in each table
SELECT COUNT(*) AS OrdersOld 
FROM OrdersOld;

SELECT COUNT(*) AS OrdersNew
FROM OrdersNew;

परिणाम:

+-------------+
| OrdersOld   |
|-------------|
| 5           |
+-------------+

+-------------+
| OrdersNew   |
|-------------|
| 0           |
+-------------+

तो जैसा कि यह अभी खड़ा है, OrdersOld इसमें 5 पंक्तियाँ और OrdersNew है खाली है।

डेटा में स्विच करने का समय।

ALTER TABLE OrdersOld
SWITCH TO OrdersNew PARTITION 3;

परिणाम:

Commands completed successfully.

डेटा को अब सफलतापूर्वक गंतव्य तालिका के विभाजन 3 में बदल दिया गया है।

आइए दोनों तालिकाओं को दोबारा जांचें।

SELECT COUNT(*) AS OrdersOld 
FROM OrdersOld;

SELECT COUNT(*) AS OrdersNew
FROM OrdersNew;

परिणाम:

+-------------+
| OrdersOld   |
|-------------|
| 0           |
+-------------+

+-------------+
| OrdersNew   |
|-------------|
| 5           |
+-------------+

इस बार OrdersOld खाली है और OrdersNew इसमें 5 पंक्तियाँ हैं।

डेटा में स्थित वास्तविक विभाजन की जांच के लिए हम निम्न क्वेरी भी चला सकते हैं।

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('OrdersNew')
ORDER BY [Partition];

परिणाम:

+-------------+--------------+--------+
| Partition   | Filegroup    | Rows   |
|-------------+--------------+--------|
| 1           | OrdersNewFg1 | 0      |
| 2           | OrdersNewFg2 | 0      |
| 3           | OrdersNewFg3 | 5      |
| 4           | OrdersNewFg4 | 0      |
+-------------+--------------+--------+

जैसा कि अपेक्षित था, सभी 5 पंक्तियों को OrdersNewFg3 . में विभाजन 3 के लिए आवंटित किया गया है फ़ाइल समूह।

सामान्य त्रुटियां

त्रुटि 4982

ऊपर दिए गए मेरे उदाहरण में, आप देखेंगे कि मैंने एक CHECK बनाया है OrdersOld . बनाते समय बाधा टेबल।

यदि आपको त्रुटि संदेश 4982 मिलता है (ALTER TABLE SWITCH statement failed... ), हो सकता है कि आपने CHECK . नहीं बनाया हो स्रोत तालिका पर बाधा।

या हो सकता है कि आपने एक CHECK बनाया हो बाधा, लेकिन यह स्विच-इन विभाजन की सीमा के बीच मूल्यों को लागू नहीं करता है।

आपको यह सुनिश्चित करने की आवश्यकता है कि स्विच-इन मान वास्तव में, विभाजन द्वारा परिभाषित सीमा के भीतर हैं, और SQL सर्वर एक CHECK की तलाश करेगा। स्रोत तालिका पर बाधा जो इसे सत्यापित करती है।

त्रुटि 4939

एक अन्य सामान्य त्रुटि 4939 है (ALTER TABLE SWITCH statement failed... )

यदि आपको यह त्रुटि मिलती है, तो शायद यह इसलिए है क्योंकि आप किसी ऐसे विभाजन पर स्विच करने का प्रयास कर रहे हैं जो स्रोत तालिका में किसी भिन्न फ़ाइल समूह का उपयोग करता है।

विभाजन को बदलने की आवश्यकताओं में से एक यह है कि स्रोत तालिका या विभाजन, और लक्ष्य तालिका या विभाजन दोनों एक ही फ़ाइल समूह में स्थित होने चाहिए।

इस त्रुटि को ठीक करने के लिए, सुनिश्चित करें कि स्रोत तालिका गंतव्य विभाजन के समान फ़ाइल समूह का उपयोग करती है।

स्विच आउट

किसी पार्टीशन को स्विच-आउट करने के तरीके के लिए SQL सर्वर में एक पार्टिशन को स्विच-आउट करें देखें।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर में कनेक्शन के लिए संयोजन कैसे सेट करें?

  2. SQL सर्वर नेटवर्क इंटरफेस:कनेक्शन स्ट्रिंग मान्य नहीं है [87]

  3. SQL सर्वर में एकल पंक्ति MERGE/अप्सर्ट के लिए सिंटैक्स

  4. तालिका नाम और तालिका के स्कीमा के साथ SQL सर्वर डेटाबेस में सभी ट्रिगर्स को सूचीबद्ध करने की आवश्यकता है

  5. क्या एक एकल SQL सर्वर कथन परमाणु और सुसंगत है?