วิธีการแบ่งพาร์ติชันตารางที่ไม่มีการแบ่งพาร์ติชันที่มีอยู่


22

ฉันมีตารางที่มีข้อมูลอยู่แล้ว:

dbo.Test (col1,col2,col3....) ON [PRIMARY]

ฉันต้องเปลี่ยนตารางนี้เพื่อให้มีการแบ่งพาร์ติชันเช่นนี้:

dbo.Test(col1,col2,col3....) ON Ps_Date(Col2)

ฉันจะทำสิ่งนี้ให้สำเร็จโดยไม่ต้องวางและสร้างโต๊ะขึ้นใหม่ได้อย่างไร?

คำตอบ:


23

หากต้องการแบ่งพาร์ติชันตารางคุณสามารถทำตามขั้นตอนสั้น ๆ ด้านล่าง:

  • ก่อนสร้างฟังก์ชั่นพาร์ทิชันและรูปแบบพาร์ทิชัน
  • หลังจากนั้นคุณสามารถแบ่งพาร์ติชันตาราง
  • หากตารางของคุณมีดัชนีคลัสเตอร์คุณจะต้องวางและสร้างใหม่บนพาร์ติชันที่เหมาะสมหรือคุณสามารถใช้DROP_EXISTINGส่วนคำสั่งเพื่อสร้างดัชนีคลัสเตอร์ใหม่ได้
  • หากตารางของคุณไม่มีดัชนีคลัสเตอร์คุณสามารถสร้างได้หนึ่งรายการบนพาร์ติชันที่เหมาะสมโดยใช้ชุดรูปแบบพาร์ติชัน
  • นอกจากนี้ยังEnterprise Editionมีความยืดหยุ่นในการใช้ที่ONLINE=ONตัวเลือกของคำสั่งสร้างดัชนีเพื่อลดการหยุดทำงานใด ๆ สำหรับการใช้งานของคุณ โปรดทราบว่าคุณจะเห็นการลดลงของประสิทธิภาพขณะที่ดัชนีกำลังถูกสร้างขึ้นใหม่โดยใช้ตัวเลือกออนไลน์

เมื่อต้องการแบ่งพาร์ติชันโดยอัตโนมัติคุณสามารถใช้ยูทิลิตี้การจัดการพาร์ติชันของเซิร์ฟเวอร์ SQLหรือSQL Server พาร์ติชันของตารางที่มีอยู่ในเฟรมเวิร์ก codeplex ได้เช่นกัน

ทรัพยากรที่ดีบางอย่าง:


53

คุณไม่ได้ระบุว่าตารางของคุณมีดัชนีกลุ่มหรือไม่ดังนั้นลองมาดูตัวเลือกทั้งหมด

ฉันจะใช้ฟังก์ชั่นพาร์ติชั่นตัวอย่าง, โครงร่างพาร์ติชั่นและตาราง:

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)คำสั่งส่วนใหญ่ของคำสั่งด้านบน ที่จะทำให้ตารางของคุณพร้อมใช้งานกับการเชื่อมต่ออื่น ๆ อย่างไรก็ตามจะมีผลกระทบต่อประสิทธิภาพในช่วงเวลานั้น


1
ยอดเยี่ยม Sabastian! เพิ่งแบนออกยอดเยี่ยม! เพียงเพิ่ม # 3 ด้านบน ... หากคุณต้องการใช้ SWITCH เข้าหรือออกดัชนีทั้งหมดจะต้องจัดตำแหน่ง การทำ PK แบบไม่รวมกลุ่มและไม่จัดแนวจะไม่อนุญาตให้คุณทำสวิทช์เว้นเสียแต่ว่าคุณจะทำตามขั้นตอนในการดร็อปดัชนีก่อนทำสวิทช์ (ทิศทางใดก็ตามที่มันอาจจะอยู่) และสร้างดัชนีใหม่ บ่อยครั้งที่มันยังเร็วกว่าการทำเทียบเท่ากับการลบและแน่นอนถ้าคุณไม่จำเป็นต้องใช้สวิทช์จะไม่เป็นปัญหา
Jeff Moden
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.