Cách tạo chỉ mục cụm trên bảng 100 GB


8

Tôi có một bảng heap chiếm khoảng 104 GB dung lượng đĩa với gần 3 tỷ hàng. Tôi đang cố gắng tạo một chỉ mục được nhóm trên bảng này trên WeekEndingDatecột [ ]. Tôi có khoảng 200 gb miễn phí trong tệp dữ liệu và khoảng 280 gb miễn phí trong tempdb.

Tôi đã thử hai phương pháp khác nhau. Đầu tiên là tạo chỉ mục trực tiếp trên bảng bằng lệnh sau:

CREATE CLUSTERED INDEX CX_WT_FOLD_HISTORY
ON WT_FOLD_HISTORY (WeekEndingDate ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = ON, 
IGNORE_DUP_KEY = OFF
, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, 
DATA_COMPRESSION = PAGE)

Tôi đã thử cả với SORT_IN_TEMPDB = ONOFF. Khi sử dụng, ONnó chứa đầy tempdb và với OFFnó chứa đầy ổ dữ liệu.

Phương pháp khác là tạo một bảng trống mới với chỉ mục cần thiết và sau đó chèn các bản ghi từ heap vào bảng mới. Điều này cũng thất bại sau khi lấp đầy ổ dữ liệu.

Bất kỳ đề nghị khác về những gì để làm. Hầu hết mọi thứ tôi đã đọc đều nói rằng tôi sẽ cần khoảng 1,2 lần kích thước của bảng để được sử dụng làm không gian làm việc trong khi tạo chỉ mục. Tôi có nhiều hơn thế và nó vẫn thất bại. Mọi lơi đê nghị đêu nên được đanh gia cao.

Đây là cấu trúc bảng heap ban đầu của tôi:

CREATE TABLE [dbo].[WT_FOLD_HISTORY](
[WeekEndingDate] [varchar](50) NULL,
[Division] [varchar](50) NULL,
[Store] [varchar](50) NULL,
[SKUNumber] [varchar](50) NULL,
[UPC] [varchar](50) NULL,
[SalesUnits] [varchar](50) NULL,
[SalesCost] [varchar](50) NULL,
[SalesRetail] [varchar](50) NULL,
[InventoryUnits] [varchar](50) NULL,
[InventoryCost] [varchar](50) NULL,
[InventoryRetail] [varchar](50) NULL,
[OnOrderUnits] [varchar](50) NULL,
[OnOrderCost] [varchar](50) NULL,
[OnOrderRetail] [varchar](50) NULL,
[ReceiptUnits] [varchar](50) NULL,
[ReceiptCost] [varchar](50) NULL,
[ReceiptRetail] [varchar](50) NULL,
[PermanentMarkdowns] [varchar](50) NULL,
[ReturnsToVendor] [varchar](50) NULL,
[POSMarkdowns] [varchar](50) NULL,
[TimeFK] [smallint] NULL,
[LocationFK] [int] NULL,
[ItemFK] [int] NULL
) ON [AcademySports_DataFG1]

Khi thực hiện phương pháp "bảng mới, di chuyển các hàng theo đợt", bạn có xóa các hàng trong bảng ban đầu khi bạn di chuyển chúng không? Bạn có thể cần phải thực hiện một số môn thể dục bổ sung để có được đống để giải phóng không gian không sử dụng khi bạn xóa dữ liệu.
AMtwo

Có thể quan tâm đến lý do tại sao một chỉ mục không phân cụm không được chấp nhận trong trường hợp này; [vâng, tôi biết về sự khác biệt / lợi ích của việc phân cụm so với không phân cụm ... chỉ tò mò về lý do tại sao bạn loại trừ một chỉ mục không phân cụm]; Ngoài ra, bảng đã có sẵn các chỉ mục không phân cụm chưa và nếu có thì chúng sử dụng bao nhiêu dung lượng? [tự hỏi nếu bỏ bất kỳ chỉ mục không phân cụm hiện tại nào có thể giải phóng đủ dung lượng để tạo chỉ mục được phân cụm không?]
markp-fuso

Bạn đã thử tạo chỉ mục với DATA_COMPRESSION=NONE? Nếu nó hoạt động, bạn có thể nén sau đó.
Dan Guzman

đẹp question.i google it.And đọc này là những gì họ nói dba.stackexchange.com/questions/11956/... hoặc stackoverflow.com/questions/2309889/... Đây là câu trả lời duy đúng.
KumarHarsh

1
Để chắc chắn, bạn có thể bao gồm thông báo lỗi thực tế mà nó không thành công?
RDFozz

Câu trả lời:


3

Nếu bạn có nhu cầu ngắn hạn về dung lượng ổ đĩa, một tùy chọn sẽ là:

  1. Thu nhỏ tempdb tạm thời, giải phóng càng nhiều dung lượng trên ổ đĩa đó dường như an toàn.
  2. Tạo một tệp dữ liệu thứ cấp cho DB mà bảng nằm trong ổ tempdb.
  3. Thêm chỉ mục cụm vào bảng.
  4. Thu nhỏ tệp thứ cấp bằng cách di chuyển tất cả dữ liệu ra khỏi tệp.
  5. Loại bỏ các tập tin thứ cấp.
  6. Đảm bảo tệp tempdb được phép phát triển theo kích thước cũ.
  7. Xây dựng lại các chỉ mục trong DB của bảng (việc loại bỏ tệp thứ cấp sẽ gây ra một số phân mảnh).

LƯU Ý: như những người khác đã đề xuất, tôi chỉ làm điều này sau khi những thứ như tạm thời xóa các chỉ mục không được nhóm khỏi bảng được đề cập. Điều này đặc biệt sẽ cho phép bổ sung chỉ mục được phân cụm đi nhanh hơn, vì tất cả các chỉ mục không được phân cụm đều phải được xây dựng lại (với một chỉ mục được đặt ở vị trí, khóa chỉ mục được sử dụng để định vị các hàng trong chính bảng) .

Đó thực sự là một điểm khác - khóa rộng bao nhiêu trên chỉ mục cụm? Nếu bạn có các chỉ mục không được phân cụm và khóa trên chỉ mục được phân cụm rộng hơn đáng kể so với con trỏ vào vùng heap, thì các chỉ mục không được phân cụm sẽ tiêu tốn nhiều không gian hơn sau khi chỉ mục được phân cụm được tạo.

Nếu khóa cụm bao gồm một số cột hoặc thậm chí một cột lớn (giả sử, một varcharcột có độ dài trung bình từ 25 trở lên), bạn có thể muốn xem xét một khóa thay thế (thường là giá trị tăng đơn điệu, để có INSERThiệu suất tốt nhất .


1

Những gì đang lấp đầy không gian của bạn là siêu sắp xếp của bạn (bạn cố gắng sắp xếp toàn bộ 104Gb của mình), vì vậy tôi nghĩ rằng nó có thể được giải quyết bằng cách sắp xếp trên các phần nhỏ hơn. Tôi đề nghị bạn tạo bảng phân cụm mới và chèn dữ liệu vào các đoạn nhỏ như thế này:

declare @rowcount int = 1;
while @rowcount > 0
begin
  delete top (5000) 
  from your_heap with(tablock) 
      output deleted.field1, ..., deleted.fieldN 
      into new_clustered_table;
  set @rowcount = @@rowcount;
end; 

Bằng cách này, bạn chỉ sắp xếp 5000 hàng mỗi lần và vấn đề duy nhất là phân chia trang không thể tránh được do bạn không thực hiện chèn được sắp xếp. Vì vậy, khi kết thúc, new_clustered_table sẽ bị phân mảnh nhưng bạn có thể xây dựng lại nó sau.


Vâng, bạn đã đúng, tôi đã cập nhật câu trả lời của mình, nhưng đó chỉ là một ý tưởng.
nhiễm trùng

0

Chỉ là một mẹo nhanh - xem xét bỏ tất cả các chỉ mục không được nhóm (nếu có) vào heap này trước khi thử tạo Chỉ mục cụm. Bạn có thể tạo kịch bản cho những người không phải CI cùng với chi tiết cột bao gồm và tạo lại chúng sau đó với định nghĩa đó sau khi Chỉ mục cụm được tạo thành công.

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.