Tôi cần bao nhiêu dung lượng đĩa để thêm khóa chính vào một bảng rất lớn?


7

Tôi đang sử dụng Microsoft SQL Server 2014 - 12.0.4100.1 Enterprise Edition (64-bit) trên Windows NT 6.3 (Build 9600 :)

Tôi có một bảng 491 GB với 3,6 tỷ hàng không có khóa chính. Khóa chính tôi muốn thêm sẽ chỉ bao gồm một bigintcột chứa các giá trị duy nhất. Cơ sở dữ liệu có 477 GB dung lượng trống, nhưng dường như điều đó là không đủ.

Cố gắng thêm nó không thành công với lỗi sau:

Không thể phân bổ không gian cho đối tượng 'dbo.SORT lưu trữ chạy tạm thời: 424251614560256' trong cơ sở dữ liệu '[Redacted]' vì nhóm tệp 'PRIMARY' đã đầy. Tạo không gian đĩa bằng cách xóa các tệp không cần thiết, thả các đối tượng trong nhóm fileg, thêm các tệp bổ sung vào filegroup hoặc cài đặt tự động bật cho các tệp hiện có trong filegroup.

Tên cơ sở dữ liệu trong lỗi là DB mà tôi đang cố thêm PK, không phải 'tempdb', đây là những gì tôi thường thấy trong loại lỗi này.

Lệnh tôi đang sử dụng:

ALTER TABLE REDACTED ADD CONSTRAINT [PK_REDACTED] PRIMARY KEY CLUSTERED 
(
    [RedactedId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

Lúc đầu, lệnh bị lỗi sau 8-9 phút, sau đó DBA của tôi đã thêm một tệp dữ liệu khác vào DB trên một ổ đĩa có khoảng 150 GB dung lượng trống. Chạy nó lần thứ hai không thành công sau 24 phút. Đó là sự tiến bộ, nhưng tôi không biết cần bao nhiêu dung lượng trống, hoặc thực sự sẽ mất bao lâu để thêm chỉ số này. Hiện tại có 477 GB miễn phí trong cơ sở dữ liệu này, nhưng dường như vẫn chưa đủ để chạy loại này.

Có cách nào để tính toán cần bao nhiêu dung lượng để chạy lệnh này trên 3,6 tỷ bigintgiá trị không? Hoặc có một số mẹo khác sẽ giúp lệnh này thành công? Con số lớn đó có nghĩa là gì trong lỗi?


5
Hướng dẫn chung là 2,5 lần, nhưng có thể có 50 biến đưa vào bất kỳ dự đoán chính xác hợp lý nào. Thay vào đó, những gì bạn có thể làm - nếu bạn có thể có một cửa sổ bảo trì - là tạo một bảng trống với khóa và chỉ mục cụm mà bạn muốn, sau đó sử dụng delete...output intotheo lô, với các hoạt động nhật ký kiểm tra / sao lưu thỉnh thoảng để ngăn nhật ký trở thành vấn đề không gian đĩa của bạn . Số chỉ là một id do hệ thống tạo ra.
Aaron Bertrand

1
Vì bạn đang tạo một chỉ mục được nhóm, nó di chuyển xung quanh tất cả dữ liệu, không chỉ các giá trị lớn.
Michael Green

Một tầm với nhưng tăng kích thước của TempDB?
paparazzo

Tạo một chỉ mục cụm không được thực hiện trong TempDB.
Glazed

Câu trả lời:


4

Tôi cũng sẽ nói thêm rằng không chỉ các trang dữ liệu sẽ được di chuyển khi tạo một chỉ mục được phân cụm - mà tất cả các chỉ mục không được phân cụm sẽ phải được xây dựng lại vì mỗi hàng trong chỉ mục không được phân cụm chứa giá trị khóa được nhóm. Tất cả các chuyển động dữ liệu này cần phải được ghi lại và quá trình sắp xếp sẽ sử dụng rất nhiều tempDb vì bạn có thể không có sẵn 500 GB bộ nhớ, phải không? ;)

Bạn sẽ tìm thấy nhiều cuộc tranh luận và ý kiến ​​khác nhau về việc sử dụng đống và tất nhiên tôi đang suy đoán ở đây nhưng rất có thể có một lý do tại sao một bảng lớn như vậy không có chỉ số cụm được xác định trên đầu trang. Đây không phải là cách thực hành tốt nhất nhưng đôi khi, thật hợp lý khi xác định một bảng không có chỉ mục được nhóm (chèn nhanh, được ghi nhật ký tối thiểu) với một vài chỉ mục không phân cụm hẹp bao gồm các truy vấn thường xuyên.

Quyết định về việc thêm bất kỳ loại chỉ mục nào (chính, phân cụm, không phân cụm, XML, không gian, ...) tất nhiên phụ thuộc vào vấn đề bạn đang cố gắng giải quyết. Trong hệ thống OLTP, bạn thường tối ưu hóa các chỉ mục của mình để cải thiện hiệu suất ghi trong khi trong các hệ thống báo cáo như OLAP, bạn thường cần phải làm việc với các loại khối lượng công việc đã đọc.

Và một vài gợi ý để kết thúc vấn đề này: - khóa chính không cần phải được phân cụm - nếu bảng không được phân vùng, bạn nên xem xét phân vùng nó - nếu mục tiêu của bạn là làm cho một số loại truy vấn nhanh hơn (và không cố thực thi tính duy nhất của cột bigint của bạn), bạn nên xem xét việc tạo thêm (hoặc sửa đổi hiện tại) chỉ mục không được phân cụm (có thể được lọc) hoặc chế độ xem được lập chỉ mục (hoàn hảo cho các truy vấn tổng hợp)

Hy vọng nó sẽ giúp, chúc may mắn!

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.