คุณไม่ได้ระบุว่าตารางของคุณมีดัชนีกลุ่มหรือไม่ดังนั้นลองมาดูตัวเลือกทั้งหมด
ฉันจะใช้ฟังก์ชั่นพาร์ติชั่นตัวอย่าง, โครงร่างพาร์ติชั่นและตาราง:
CREATE PARTITION FUNCTION pf1(INT) AS RANGE LEFT FOR VALUES(10,20,30,40);
GO
CREATE PARTITION SCHEME ps1 AS PARTITION pf1 ALL TO ([PRIMARY])
GO
CREATE TABLE dbo.pt(pc INT NOT NULL, id INT NOT NULL) ON [PRIMARY];
GO
1. ตารางของคุณมีดัชนีคลัสเตอร์ที่ไม่ได้สร้างขึ้นโดยข้อ จำกัด
นี่เป็นกรณีที่ง่ายที่สุด คุณสามารถใช้CREATE INDEX
คำสั่งที่มีส่วนDROP_EXISTING
คำสั่งเพื่อย้ายตารางไปที่รูปแบบพาร์ทิชัน
สมมติว่าตัวอย่างที่ดัชนีคลัสเตอร์นี้ถูกสร้างขึ้น:
CREATE UNIQUE CLUSTERED INDEX ptc ON dbo.pt(Id) ON [PRIMARY];
ในการแบ่งพาร์ติชันตารางนี้ดัชนีคลัสเตอร์ได้รวมคอลัมน์พาร์ติชัน (pt ในกรณีของเรา) เป็นส่วนหนึ่งของคีย์ คำสั่งนี้เปลี่ยนดัชนีคลัสเตอร์เพื่อรวมคอลัมน์พาร์ติชันและพาร์ติชันพร้อมกัน:
CREATE UNIQUE CLUSTERED INDEX ptc ON dbo.pt(pc, Id) WITH(DROP_EXISTING = ON)ON ps1(pc) ;
ส่วนDROP_Existing
คำสั่งจะลบดัชนีที่มีอยู่โดยอัตโนมัติก่อนสร้างดัชนีใหม่ สิ่งนี้เป็นที่ต้องการมากกว่าการแยกDROP INDEX
เนื่องจากจะทำให้ดัชนีที่ไม่ได้คลัสเตอร์จะถูกสร้างใหม่เพียงครั้งเดียว
2. ตารางของคุณมีดัชนีคลัสเตอร์ที่เป็นส่วนหนึ่งของPRIMARY KEY
หรือUNIQUE
ข้อ จำกัด และมีคอลัมน์พาร์ติชันเป็นส่วนหนึ่งของคีย์
อันนี้ก็ยังง่ายและคล้ายกับอันก่อน ๆ
สมมติว่าPRIMARY KEY
ข้อ จำกัดนี้ถูกสร้างขึ้นบนโต๊ะ:
ALTER TABLE dbo.pt ADD CONSTRAINT ptc PRIMARY KEY CLUSTERED (pc, Id) ON [PRIMARY];
ตอนนี้คุณสามารถเรียกใช้สคริปต์การสร้างใหม่เดียวกับที่เราใช้ใน 1:
CREATE UNIQUE CLUSTERED INDEX ptc ON dbo.pt(pc, Id) WITH(DROP_EXISTING = ON)ON ps1(pc) ;
3. ตารางมีดัชนีคลัสเตอร์ที่ไม่รวมคอลัมน์พาร์ติชัน แต่ถูกสร้างขึ้นเป็นส่วนหนึ่งของPRIMARY KEY
หรือUNIQUE
ข้อ จำกัด
โชคดี คุณไม่สามารถเปลี่ยนคำจำกัดความของPRIMARY KEY
หรือUNIQUE
ข้อ จำกัด หลังจากข้อเท็จจริง ตัวเลือกเดียวของคุณคือการวางข้อ จำกัด แล้วสร้างใหม่รวมถึงคอลัมน์พาร์ติชันหรือสร้างดัชนีคลัสเตอร์โดยไม่ขึ้นอยู่กับข้อ จำกัด ที่มีคอลัมน์พาร์ติชัน ในกรณีที่สองคุณสามารถสร้างข้อ จำกัด ใหม่NONCLUSTERED
โดยไม่รวมคอลัมน์พาร์ติชัน เพราะตอนนี้ข้อ จำกัด นี้ไม่ได้จัดตำแหน่ง (หมายถึงดัชนีที่สนับสนุนไม่ได้ถูกแบ่งพาร์ติชัน) คุณต้องระบุตำแหน่งที่จะวางบนดิสก์
สมมติว่าตารางมีคีย์หลักเช่นนี้:
ALTER TABLE dbo.pt ADD CONSTRAINT ptc PRIMARY KEY CLUSTERED (Id) ON [PRIMARY];
ในการแบ่งพาร์ติชันตารางนี้คุณจะต้องวางข้อ จำกัด ก่อน:
ALTER TABLE dbo.pt DROP CONSTRAINT ptc;
จากนั้นคุณต้องสร้างดัชนีคลัสเตอร์ที่แบ่งพาร์ติชัน:
CREATE UNIQUE CLUSTERED INDEX ptci ON dbo.pt(pc, Id) ON ps1(pc) ;
หากคุณเลือกที่จะสร้างPRIMARY KEY
ข้อ จำกัด ที่ไม่มีการจัดแนวใหม่คุณสามารถทำได้เช่นนี้
ALTER TABLE dbo.pt ADD CONSTRAINT ptc PRIMARY KEY NONCLUSTERED (Id) ON [PRIMARY];
4. ตารางของคุณไม่มีดัชนีคลัสเตอร์
ในกรณีนี้ขอแนะนำในกรณีส่วนใหญ่เพียงแค่สร้างดัชนีคลัสเตอร์เพื่อสร้างการแบ่งพาร์ติชัน คุณสามารถใช้คำสั่งสร้างดัชนีที่เห็นก่อนหน้านี้สำหรับ:
CREATE UNIQUE CLUSTERED INDEX ptci ON dbo.pt(pc, Id) ON ps1(pc) ;
อย่างไรก็ตามหากคุณมีเหตุผลที่ดีที่จะไม่สร้างดัชนีคลัสเตอร์คุณสามารถหลีกเลี่ยงได้ด้วยวิธีการสองขั้นตอนต่อไปนี้ น่าเศร้าที่ไม่มีวิธีโดยตรงในการเปลี่ยนแปลงนี้
สมมติว่าตารางของคุณไม่มีดัชนีคลัสเตอร์ ในการแบ่งพาร์ติชั่นตารางคุณต้องสร้างCLUSTERED UNIQUE
ข้อ จำกัด ก่อน (คุณสามารถใช้CLUSTERED PRIMARY KEY
ข้อ จำกัด ) หากคุณมีชุดค่าผสมของคอลัมน์ที่ไม่ซ้ำกันซึ่งเป็นขั้นตอนง่าย ๆ :
ALTER TABLE dbo.pt ADD CONSTRAINT ptc UNIQUE CLUSTERED(pc,id);
หลังจากสร้างข้อ จำกัด แล้วคุณสามารถวางได้อีกครั้งและ "ย้าย" ตารางไปที่ชุดรูปแบบพาร์ติชันใหม่ในเวลาเดียวกัน:
ALTER TABLE dbo.pt DROP CONSTRAINT ptc WITH(MOVE TO ps1(pc));
หากคุณไม่มีชุดค่าผสมของคอลัมน์ที่ไม่ซ้ำกันคุณจะโชคดี ในกรณีนี้ตัวเลือกเดียวของคุณคือการเพิ่มคอลัมน์ใหม่และเติมด้วยค่าที่ไม่ซ้ำ หากตารางมีขนาดเล็กพอสมควรคุณสามารถทำสิ่งนี้:
ALTER TABLE dbo.pt ADD tmp_id INT IDENTITY(1,1);
อย่างไรก็ตามจะมีการล็อคตารางแบบเอกสิทธิ์เฉพาะบุคคลจนกว่าจะมีการประเมินค่าแถวทั้งหมด ขึ้นอยู่กับขนาดของโต๊ะซึ่งอาจใช้เวลาพอสมควร หลังจากคอลัมน์นั้นถูกสร้างขึ้นให้ทำตามสองขั้นตอนข้างต้นเพื่อสร้างUNIQUE
ข้อ จำกัด ก่อนจากนั้นจึงวางลงอีกครั้งทันที หลังจากนั้นคุณสามารถวางคอลัมน์อีกครั้งได้ ขั้นตอนทั้งหมดเหล่านี้ค่อนข้างล่วงล้ำดังนั้นคุณน่าจะดีกว่าที่จะสร้างดัชนีกลุ่มบนตาราง ที่ไม่ต้องเป็นเอกลักษณ์
หากคุณมี Enterprise Edition คุณสามารถใช้WITH(ONLINE=ON)
คำสั่งส่วนใหญ่ของคำสั่งด้านบน ที่จะทำให้ตารางของคุณพร้อมใช้งานกับการเชื่อมต่ออื่น ๆ อย่างไรก็ตามจะมีผลกระทบต่อประสิทธิภาพในช่วงเวลานั้น