2009-04-01 24 views
6

Tôi có một bảng có chỉ số nhóm trên hai cột - khóa chính cho bảng. Nó được định nghĩa như sau:Cách tốt nhất để thay đổi chỉ số nhóm (PK) trong SQL 2005

ALTER TABLE Table ADD CONSTRAINT [PK_Table] PRIMARY KEY CLUSTERED 
(
    [ColA] ASC, 
    [ColB] ASC 
)WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY] 

Tôi muốn loại bỏ chỉ số PK nhóm này và thêm một chỉ số clustered như sau và thêm một ràng buộc khoá chính sử dụng một chỉ số không clustered, cũng hiển thị dưới đây.

CREATE CLUSTERED INDEX [IX_Clustered] ON [Table] 
(
    [ColC] ASC, 
    [ColA] ASC, 
    [ColD] ASC, 
    [ColE] ASC, 
    [ColF] ASC, 
    [ColG] ASC 
)WITH (PAD_INDEX = ON, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF,  DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, FILLFACTOR = 90, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = OFF) ON [PRIMARY] 

ALTER TABLE Table ADD CONSTRAINT 
    PK_Table PRIMARY KEY NONCLUSTERED 
    (
    ColA, 
    ColB 
) WITH(STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 

tôi sẽ chỉ cần thả PK nhóm chỉ số, sau đó thêm các chỉ số nhóm mới và sau đó thêm các chỉ số chủ chốt non-clustered tiểu học, nhưng tôi biết rằng thả clustered index hiện tại sẽ làm cho dữ liệu bảng để được sắp xếp lại (xem câu trả lời ở đây What happens when I drop a clustered primary key in SQL 2005), mà tôi không nghĩ là cần thiết. Bảng đang gõ 1 TB, vì vậy tôi thực sự muốn tránh bất kỳ sắp xếp lại không cần thiết nào.

Câu hỏi của tôi là, cách tốt nhất để đi từ cấu trúc hiện tại đến cấu trúc mong muốn là gì?

CHỈNH SỬA: Chỉ muốn làm rõ. Bảng là 1TB và tiếc là tôi không có không gian để tạo một bảng tạm thời. Nếu có một cách để làm điều đó mà không tạo ra một bảng tạm thời sau đó xin vui lòng cho tôi biết.

Trả lời

8

Nếu bảng của bạn là nhận được lên đến 1 TB trong kích thước và có thể có rất nhiều hàng trong nó, tôi mạnh mẽ khuyên bạn nên không làm cho chỉ số nhóm mà nhiều béo hơn!

Trước hết, việc giảm và tạo lại chỉ mục nhóm sẽ xáo trộn xung quanh TẤT CẢ dữ liệu của bạn ít nhất một lần - chỉ riêng việc đó sẽ mất độ tuổi.

Thứ hai, chỉ số cụm phức hợp lớn mà bạn đang cố gắng tạo sẽ làm tăng đáng kể kích thước của tất cả các chỉ mục không nhóm của bạn (vì chúng chứa giá trị chỉ mục toàn bộ nhóm trên mỗi nút lá).

Câu hỏi đặt ra là nhiều hơn: tại sao bạn lại cố gắng làm điều này? Bạn không thể chỉ thêm một chỉ mục khác được nhóm lại với các cột đó, để có thể bao gồm các truy vấn của bạn? Tại sao điều này phải là chỉ mục nhóm? Tôi không thấy bất kỳ lợi thế nào trong đó ....

Để biết thêm thông tin về lập chỉ mục và đặc biệt là tranh luận chỉ mục nhóm, hãy xem Kimberly Tripp's blog trên chỉ mục SQL Server - rất hữu ích!

Marc

4
  1. Tạo một bảng mới:

    CREATE TABLE newtable (colA INT, colB INT) 
    
    • Chèn tất cả các giá trị từ bảng cũ vào bảng mới:

      INSERT VÀO newtable SELECT * FROM tên_bảng

    • Thả cũ bảng:

      DROP TABLE bảng

    • Đổi tên bảng mới vào bảng cũ

      EXEC sp_rename 'newtable', 'bảng'

    • Xây dựng các chỉ số:

      ALTER TABLE Bảng THÊM XÂY DỰNG PK_TỪNG KHÓA CHÍNH TỪ KHÔNG ĐƯỢC CHẤP NHẬN ( ColA, ColB ) VỚI (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [TIỂU]

+0

Đó không phải là một tùy chọn. Tôi có một bảng 1TB trên RAID 1.5TB. –

+0

SQL Server sẽ cần không gian cho cả sắp xếp lại và di chuyển. Nếu bạn đã hết dung lượng, bạn có thể sử dụng tùy chọn MOVE TO trong DROP INDEX để tạo bảng của bạn trên bộ nhớ tạm thời và sau đó tạo lại nó trên RAID của bạn. – Quassnoi

+0

Bạn có thể chuyển các hàng thành từng phần, xóa chúng khỏi nguồn khi bạn di chuyển. Điều đó có lẽ sẽ là một quá trình rất chậm mặc dù. –

11

Đây không phải là một câu trả lời hoàn chỉnh cho câu hỏi của bạn, nhưng chắc chắn rằng nếu bạn có bất kỳ chỉ mục nào khác trên bảng mà bạn thả các chỉ mục đó trước. Nếu không, SQL Server sẽ phải xây dựng lại tất cả khi bạn loại bỏ chỉ số nhóm sau đó xây dựng lại tất cả một lần nữa khi bạn thêm lại một chỉ số nhóm mới.Các bước thông thường là:

  1. Remove tất cả các chỉ số không clustered
  2. Remove clustered index
  3. Thêm clustered index mới
  4. Thêm lại tất cả các chỉ số không clustered
+0

Vâng, đó là kế hoạch ban đầu của tôi, nhưng bước thứ hai của việc loại bỏ chỉ số nhóm làm cho tất cả dữ liệu được di chuyển. Tôi đã hy vọng hợp nhất bước 2 và 3 bằng cách nào đó, để tránh chuyển động dữ liệu không cần thiết. –

-1

Chỉ mục nhóm không thực sự thay đổi thứ tự vật lý của dữ liệu được lưu trữ trong bảng. Nó đã không được theo cách này kể từ SQL 6,5.

Dữ liệu trên các trang được lưu trữ theo đúng thứ tự. Các trang có thể được lưu trữ trên đĩa theo bất kỳ thứ tự vật lý nào.

+0

có đúng không? Tôi đã bị ấn tượng rằng thứ tự vật lý của dữ liệu được xác định bằng khóa phân cụm. –

+0

Dữ liệu trên các trang được lưu trữ theo đúng thứ tự. Các trang có thể được lưu trữ trên đĩa theo bất kỳ thứ tự vật lý nào. – mrdenny

+2

Bạn có thể muốn cập nhật câu trả lời của mình để bao gồm sự khác biệt này. –

Các vấn đề liên quan