Cách phân vùng bảng không phân vùng hiện có


22

Tôi có một bảng hiện có dữ liệu:

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

Tôi cần thay đổi bảng này để được phân vùng như thế này:

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

Làm thế nào tôi có thể đạt được điều này mà không làm rơi và tạo lại bảng?

Câu trả lời:


23

Để phân vùng một bảng, bạn có thể làm theo các bước ngắn gọn dưới đây:

  • đầu tiên tạo một chức năng phân vùngsơ đồ phân vùng
  • Sau đó, bạn có thể phân vùng một bảng.
  • NẾU bảng của bạn có một chỉ mục được nhóm, sau đó bạn cần thả và tạo lại nó trên phân vùng bên phải hoặc bạn có thể sử dụng DROP_EXISTINGmệnh đề để tạo lại chỉ mục được nhóm.
  • Nếu bảng của bạn không có một chỉ mục được nhóm, thì bạn chỉ có thể tạo một chỉ mục trên phân vùng bên phải bằng cách sử dụng sơ đồ phân vùng.
  • Ngoài ra Enterprise Edition có tính linh hoạt trong việc sử dụng ONLINE=ONtùy chọn của câu lệnh CREATE INDEX để giảm thiểu mọi thời gian chết cho ứng dụng của bạn. Lưu ý rằng bạn sẽ thấy sự suy giảm hiệu suất trong khi chỉ mục đang được xây dựng lại bằng tùy chọn TRỰC TUYẾN.

Để tự động phân vùng, bạn cũng có thể sử dụng tiện ích Quản lý phân vùng SQL Server hoặc Khung bảng phân vùng SQL Server có sẵn trên codeplex.

Một số tài nguyên tốt:


53

Bạn không chỉ định xem bảng của mình có chỉ mục được nhóm hay không, vì vậy hãy xem qua tất cả các tùy chọn.

Tôi sẽ sử dụng chức năng phân vùng ví dụ này, sơ đồ phân vùng và bảng:

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. Bảng của bạn có một chỉ mục được nhóm không được tạo bởi một ràng buộc.

Đây là trường hợp dễ nhất. Bạn chỉ có thể sử dụng CREATE INDEXcâu lệnh với DROP_EXISTINGmệnh đề để di chuyển bảng vào sơ đồ phân vùng.

Giả sử ví dụ rằng chỉ mục cụm này đã được tạo:

CREATE UNIQUE CLUSTERED INDEX ptc ON dbo.pt(Id) ON [PRIMARY];

Để phân vùng bảng này, chỉ mục được nhóm đã bao gồm cột phân vùng (pt trong trường hợp của chúng tôi) như là một phần của khóa. Câu lệnh này thay đổi chỉ mục được nhóm để bao gồm cột phân vùng và phân vùng nó cùng một lúc:

CREATE UNIQUE CLUSTERED INDEX ptc ON dbo.pt(pc, Id) WITH(DROP_EXISTING = ON)ON ps1(pc) ;

Các DROP_Existingkhoản tự động loại bỏ các chỉ số hiện có trước khi tạo một hình mới. Điều này được ưu tiên hơn một phần riêng biệt DROP INDEXvì nó làm cho các chỉ mục không bao gồm chỉ được xây dựng lại một lần.

2. Bảng của bạn có một chỉ mục được nhóm là một phần của một PRIMARY KEYhoặc UNIQUEràng buộc và nó chứa cột phân vùng như là một phần của khóa

Cái này vẫn dễ và rất giống với cái trước.

Giả sử PRIMARY KEYràng buộc này đã được tạo trên bảng:

ALTER TABLE dbo.pt ADD CONSTRAINT ptc PRIMARY KEY CLUSTERED (pc, Id) ON [PRIMARY];

Bây giờ bạn có thể chạy tập lệnh tái tạo tương tự mà chúng tôi đã sử dụng trong 1:

CREATE UNIQUE CLUSTERED INDEX ptc ON dbo.pt(pc, Id) WITH(DROP_EXISTING = ON)ON ps1(pc) ;

3. Bảng có một chỉ mục được nhóm không bao gồm cột phân vùng nhưng được tạo như một phần của một PRIMARY KEYhoặc UNIQUEràng buộc

May mắn lớn. Bạn không thể thay đổi định nghĩa của một PRIMARY KEYhoặc UNIQUEràng buộc sau thực tế. Tùy chọn duy nhất của bạn là loại bỏ ràng buộc và sau đó tạo lại nó bao gồm cột phân vùng hoặc tạo một chỉ mục cụm độc lập với ràng buộc bao gồm cột phân vùng. Trong trường hợp thứ hai, bạn có thể tạo lại ràng buộc NONCLUSTEREDmà không bao gồm cột phân vùng. Bởi vì bây giờ ràng buộc này không được căn chỉnh (có nghĩa là chỉ mục hỗ trợ của nó không được phân vùng), bạn phải chỉ định nơi đặt nó trên đĩa.

Giả sử bảng có khóa chính như thế này:

ALTER TABLE dbo.pt ADD CONSTRAINT ptc PRIMARY KEY CLUSTERED (Id) ON [PRIMARY];

Để phân vùng bảng này, bạn phải loại bỏ ràng buộc trước:

ALTER TABLE dbo.pt DROP CONSTRAINT ptc;

Sau đó, bạn cần tạo chỉ mục phân cụm:

CREATE UNIQUE CLUSTERED INDEX ptci ON dbo.pt(pc, Id) ON ps1(pc) ;

Nếu bạn chọn tạo lại PRIMARY KEYràng buộc không liên kết, bạn có thể làm như vậy:

ALTER TABLE dbo.pt ADD CONSTRAINT ptc PRIMARY KEY NONCLUSTERED (Id) ON [PRIMARY];

4. Bảng của bạn không có chỉ mục được nhóm

Trong trường hợp này, trong hầu hết các trường hợp, chỉ nên tạo một chỉ mục cụm để thiết lập phân vùng. Bạn có thể sử dụng câu lệnh tạo chỉ mục đã thấy trước đó cho điều đó:

CREATE UNIQUE CLUSTERED INDEX ptci ON dbo.pt(pc, Id) ON ps1(pc) ;

Tuy nhiên, nếu bạn có lý do chính đáng để không tạo chỉ mục cụm, bạn có thể thoát khỏi phương pháp hai bước sau đây. Đáng buồn thay, không có cách trực tiếp để thực hiện thay đổi này.

Giả sử bảng của bạn không có chỉ mục được nhóm. Để phân vùng bảng, trước tiên bạn cần tạo một CLUSTERED UNIQUEràng buộc. (Bạn cũng có thể sử dụng một CLUSTERED PRIMARY KEYràng buộc). Nếu bạn có một kết hợp cột duy nhất đó là một bước đơn giản:

ALTER TABLE dbo.pt ADD CONSTRAINT ptc UNIQUE CLUSTERED(pc,id);

Sau khi ràng buộc được tạo, bạn có thể thả lại và "di chuyển" bảng sang sơ đồ phân vùng mới cùng một lúc:

ALTER TABLE dbo.pt DROP CONSTRAINT ptc WITH(MOVE TO ps1(pc));

Nếu bạn không có kết hợp cột là duy nhất, bạn sẽ không gặp may. Trong trường hợp này, tùy chọn duy nhất của bạn là thêm một cột mới và điền vào nó với các giá trị duy nhất. Nếu cái bàn nhỏ một cách hợp lý, bạn có thể làm một cái gì đó như thế này:

ALTER TABLE dbo.pt ADD tmp_id INT IDENTITY(1,1);

Tuy nhiên, điều đó sẽ mất một khóa bảng độc quyền cho đến khi tất cả các hàng có giá trị. Tùy thuộc vào kích thước bảng, điều này có thể khá lâu. Sau khi cột được tạo, hãy làm theo hai bước trên để trước tiên tạo UNIQUEràng buộc và sau đó thả lại ngay lập tức. Sau đó, bạn cũng có thể thả cột một lần nữa. Tất cả các bước này khá khó khăn, vì vậy bạn có lẽ tốt hơn là chỉ tạo một chỉ mục được nhóm trên bảng. Điều đó thậm chí không phải là duy nhất.


Nếu bạn có Phiên bản doanh nghiệp, bạn có thể sử dụng WITH(ONLINE=ON)mệnh đề trên hầu hết các câu trên. Điều đó sẽ giữ cho bảng của bạn có sẵn cho các kết nối khác. Tuy nhiên, sẽ có một tác động hiệu suất trong thời gian đó.


1
Tuyệt vời, Sabastian! Chỉ cần căn hộ xuất sắc! Chỉ cần thêm vào số 3 ở trên ... nếu bạn muốn sử dụng SWITCH vào hoặc ra, tất cả các chỉ mục phải được căn chỉnh. Tạo một PK không phân cụm, không liên kết sẽ không cho phép bạn thực hiện SWITCH trừ khi bạn thực hiện các bước để loại bỏ chỉ mục trước, thực hiện SWITCH (bất kỳ hướng nào có thể theo hướng) và xây dựng lại chỉ mục. Điều đó rất thường xuyên vẫn nhanh hơn so với thực hiện tương đương với xóa và tất nhiên, nếu bạn không cần sử dụng SWITCH, sẽ không thành vấn đề.
Jeff Moden
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.