Cập nhật đã thực hiện phân vùng tất cả các cách để sản xuất:
Quyết định phân vùng đúng cho một chỉ mục cửa hàng cột (CCI) được phân cụm là một quá trình rất riêng biệt. Nếu các phân vùng sai được chọn, hiệu năng và nén sẽ tệ hơn trong sơ đồ không phân vùng.
Bởi vì tôi đã phân vùng bốn CCI, tôi đã chọn CCI với ít bản ghi nhất và chia số lượng bản ghi của nó cho 1.048.576 (kích thước nhóm hàng CCI lý tưởng). Tôi đã sử dụng thương số đó như số lượng phân vùng đề xuất của tôi. Sau đó, tôi đã chạy các truy vấn đếm bản ghi dựa trên sơ đồ đó để trả về số lượng hàng thực tế trên mỗi phân vùng. Bước này là để đảm bảo có sự phân phối hợp lý các bản ghi giữa các phân vùng. Có. May mắn cho tôi
Một trở ngại đã xuất hiện: quá trình phân tích sản xuất này đã giúp tôi đến đúng số lượng phân vùng, nhưng chỉ để sản xuất. Môi trường thấp hơn của tôi nhỏ hơn nhiều so với sản xuất. Mức phân vùng được chọn đã cắt dữ liệu tốt đến mức tôi không có nhóm hàng đầy đủ nào cả. Các cơ sở dữ liệu thấp hơn đã lớn hơn và thời gian truy vấn giữ nguyên. IO đã đi xuống đáng kể và tôi đã phải chỉ ra điều đó nhiều lần vì lợi ích của sáng kiến này đã bị nghi ngờ. Thật khó để chứng minh rằng phân vùng thực sự sẽ giúp ích cho đến khi tôi đi vào sản xuất.
Kết quả: Phân vùng đã là một thành công lớn trong sản xuất. IO đang giảm và thời gian truy vấn của tôi đã giảm từ 70% trở lên. Tôi cũng có nhiều tùy chọn hơn để quản lý các bảng này theo từng phần nhỏ.
Một số lưu ý: chọn trường chính xác để phân vùng. Nếu bạn có các truy vấn phải điều hướng nhiều phân vùng, bạn có thể thấy hiệu suất bị giảm. Ngoài ra, tôi đã chừa chỗ cho sự tăng trưởng, thêm các phân vùng và phạm vi vào chức năng phân vùng của tôi cho dữ liệu hiện không có nhưng sẽ có một ngày.
Câu trả lời gốc chỉ từ thử nghiệm cục bộ:
Kể từ khi hỏi câu hỏi này, tôi đã nghiên cứu thêm và POC tại địa phương. Đó là đề nghị tôi chia sẻ POC này trong một câu trả lời.
Trong POC của tôi, tôi đã chọn sử dụng chức năng phân vùng:
CREATE PARTITION FUNCTION [MyIntPF](int)
AS RANGE LEFT
FOR VALUES (
N'50'
, N'100'
, N'150'
, N'200'
, N'250'
, N'300'
, N'350'
, N'400'
, N'450'
, N'500'
);
CREATE PARTITION SCHEME [MyIntPS]
AS PARTITION [MyIntPF]
TO (
[MyInt050fg]
, [MyInt100fg]
, [MyInt150fg]
, [MyInt200fg]
, [MyInt250fg]
, [MyInt300fg]
, [MyInt350fg]
, [MyInt400fg]
, [MyInt450fg]
, [MyInt500fg]
, [MyInt000fg]
);
Hàm này gán 50 MyInt cho mỗi phân vùng có chỗ cho một chút tăng trưởng.
Hãy nhớ rằng tôi có khoảng 350 MyInt khác nhau trong các bản ghi 170M trong CCI SẢN XUẤT. David Browne đã đề xuất kích thước bản ghi tối thiểu là 1M trong một phân vùng, điều này có ý nghĩa để tối ưu hóa phân đoạn nén CCI. Tôi đang sai lầm lớn hơn vì hai lý do. Lý do đầu tiên là để tránh tạo ra một quái vật POC 100 phân vùng. Thứ hai là tôi cho rằng 1M áp dụng cho mỗi bảng trong phân vùng. Tôi đang phân vùng bốn cột, nhỏ nhất trong số đó có 25 triệu bản ghi. Nếu tôi chia nó thành 100 mảnh thì nó sẽ không bao giờ đạt được một phân khúc đầy đủ.
Trong DB phát triển địa phương của tôi, tôi có các bản ghi 2,2M trong CCI ngoài cùng bên trái, và thậm chí ít hơn so với CCI con. Điều này trình bày một vấn đề để tạo ra một bản sao thực tế của SẢN PHẨM. Tôi thực sự nên ưu tiên thêm một chút thời gian để tạo một DB cục bộ lớn cho việc này, nhưng trong lúc này, đây là kết quả IO trước / sau của phân vùng cục bộ. Tôi đã truy vấn tổng hợp từ CCI ngoài cùng bên trái của tôi dựa trên MyInt = một giá trị duy nhất.
Không được phân vùng
Quét số 1, đọc logic 0, đọc vật lý 0, đọc trước 0, đọc logic 1548, đọc logic 1548,
lob vật lý đọc 0, lob đọc trước đọc 44.
Phân đoạn đọc 4, phân đoạn bỏ qua 0.
Phân vùng
Quét số 1, đọc logic 0, đọc vật lý 0, đọc trước 0, đọc logic lob,
lob vật lý đọc 0, lob đọc trước đọc 0.
Phân đoạn đọc 1, phân đoạn bỏ qua 0.
Như mong đợi, SQL Server có thể bỏ qua tất cả trừ một trong các phân vùng của tôi trong truy vấn có vị từ đẳng thức MyInt.
Tôi đang tiếp tục làm việc này và nên có thời gian để cập nhật ở đây khi mọi thứ tiến triển.