Câu trả lời:
Để 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:
DROP_EXISTING
mệnh đề để tạo lại chỉ mục được nhóm.ONLINE=ON
tù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:
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 INDEX
câu lệnh với DROP_EXISTING
mệ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_Existing
khoả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 INDEX
vì 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 KEY
hoặc UNIQUE
rà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 KEY
rà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 KEY
hoặc UNIQUE
ràng buộc
May mắn lớn. Bạn không thể thay đổi định nghĩa của một PRIMARY KEY
hoặc UNIQUE
rà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 NONCLUSTERED
mà 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 KEY
rà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 UNIQUE
ràng buộc. (Bạn cũng có thể sử dụng một CLUSTERED PRIMARY KEY
rà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 UNIQUE
rà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 đó.