Làm thế nào để ngăn chặn sự phân mảnh chỉ số hàng ngày 99%


11

Tôi có một bảng điểm cao cho 100.000 người chơi đang được chèn vào 2 lần một ngày với một bản ghi cho mỗi người chơi. Vào cuối ngày, sự phân mảnh chỉ mục cho các chỉ mục trong bảng đó là 99%. Có cách nào để ngăn chặn điều này bằng cách điều chỉnh các cài đặt không?

CREATE TABLE HighScore(
    [id] [int] IDENTITY(1,1) NOT NULL,
    [user] [int] NULL,
    [player] [int] NULL,
    [round] [tinyint] NULL,
    [group] [int] NULL,
    [rank] [int] NULL,
    [delta] [int] NULL,
    [roundpoints] [int] NULL,
    [totalpoints] [int] NULL,
PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 80) ON [PRIMARY]
) ON [PRIMARY]


CREATE NONCLUSTERED INDEX [HighScore_RoundGroup_Nidx] ON .[HighScore] 
(
    [round] ASC,
    [group] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 80) ON [PRIMARY]
GO

1
Câu hỏi ngớ ngẩn, nhưng để bao gồm tất cả các cơ sở - bạn đang xây dựng lại / sắp xếp lại mỗi ngày?
JHFB

không có BẢNG DDL bất cứ ai đăng sẽ đoán. Bạn có đang sử dụng GUID làm khóa chính không?
Người học SQL

Tôi đang xây dựng lại mỗi ngày ngay bây giờ nhưng tôi tự hỏi liệu tôi có thể ngăn điều này xảy ra mỗi ngày hay không vì tôi có thể dự đoán khá tốt về cách dữ liệu phát triển.
olle

1
Làm thế nào để bạn xác định mức độ phân mảnh? Tôi sẽ không mong đợi nhiều sự phân mảnh hợp lý cho chỉ số được nhóm. Một số phân mảnh nội bộ mặc dù, bạn không cần FILLFACTOR = 80ở đó. Nó sẽ chỉ lãng phí không gian. Tất cả các cột có độ dài cố định để một hàng không thể mở rộng khi cập nhật và việc chèn không thể xảy ra ở giữa bảng. 99% dường như cao bất ngờ cho các chỉ số khác quá. Có bao nhiêu trang trong mỗi chỉ mục?
Martin Smith

99% sau khi xây dựng lại mỗi ngày sẽ thực sự sẽ đi một số, bạn có thể hiển thị sys.dm_db_index_physical_statsđầu ra của bạn ?
Martin Smith

Câu trả lời:


3

Tôi nghĩ bạn nên thử FILLFACTORcài đặt cao hơn trên HighScore_RoundGroup_Nidx(ví dụ 50 hoặc 40). Bạn có thể đặt FILLFACTORthành 0 hoặc 100 cho PRIMARY KEYvì nó không bị phân mảnh Nếu vẫn không có, FILLFACTORvì lý do là các trang mới được phân bổ xen kẽ với các trang mới được phân bổ khác. Đây là một vấn đề SQL Server nổi tiếng. Bạn có thể chuyển chỉ mục này vào nhóm riêng của mình để ngăn chặn vấn đề này.


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.