Tôi nên tạo bao nhiêu phân vùng cho các bảng chỉ mục cột của cụm? Tôi có nên phân vùng các bảng hàng cũng không?


7

Tôi có một kho dữ liệu bao gồm bốn bảng chỉ mục cột kho (CCI) và chín bảng hàng. Các bảng này chỉ được sử dụng để phân tích và dữ liệu CCI được chèn từ các bảng phân tầng cứ sau 15 phút. Tôi đang tìm cách tối ưu hóa hiệu năng truy vấn bằng cách thêm phân vùng và sắp xếp.

Tất cả các truy vấn của dữ liệu này được xác định trên một trường số nguyên với khoảng 350 giá trị riêng biệt. CCI ngoài cùng bên trái có 100M bản ghi và 125 cột. Có ba CCI con có cùng một trường số nguyên. CCI 2 có 15M bản ghi và 150 cột, CCI 3 và 4 đều có khoảng 30M bản ghi và 25 cột mỗi bản ghi.

Trong số 350 số nguyên riêng biệt này, phân phối số lượng bản ghi trong bảng ngoài cùng bên trái như sau:

  • 5% lớn hơn 1 triệu
  • 46% lớn hơn 100K
  • 83% Lớn hơn 10K

Ngoài ra, có chín bảng hàng khác cũng tham gia vào CCI. Chúng có các phần nhỏ giọt, là con của CCI và tất cả chúng đều chứa cùng một trường số nguyên. Các hàng này có khối lượng bản ghi tương tự hoặc nhỏ hơn, mỗi cột <10 cột, hai cột chứa LOBS và hai lần cập nhật hàng loạt thường xuyên (những cập nhật này cũng được quy định trên trường ID).

Tôi nên làm bao nhiêu phân vùng?

Tôi có nên phân vùng các bảng hàng cũng không?

Có những cân nhắc quan trọng tôi đang xem xét?

Lưu ý về "sắp xếp" tôi đã đề cập trước đó:

Trường ngày trong CCI ngoài cùng bên trái thường là một biến vị ngữ thứ cấp trong các truy vấn này, do đó tôi đang xem xét sắp xếp lại CCI đó theo ngày cứ sau bốn tuần để bảo trì. Tôi sẽ đạt được loại này bằng cách loại bỏ CCI, thêm chỉ mục cửa hàng được phân cụm vào ngày, bỏ chỉ mục đó và sau đó thêm lại CCI với MAXDOP = 1. Tôi cũng đang xem xét sắp xếp các CCI con bằng khóa tham gia cho cha mẹ của chúng.

Câu trả lời:


8

Lợi ích của việc phân vùng CCI:

  1. Hiệu suất truy vấn có thể được cải thiện vì mức độ loại bỏ nhóm hàng tối thiểu được đảm bảo, mặc dù dữ liệu được tải hoặc sửa đổi như thế nào. Hầu hết các hướng dẫn phân vùng SQL Server chung ngoài kia không tính đến điều này.

  2. Cải thiện tính linh hoạt với các hoạt động bảo trì ở chỗ bạn có thể xây dựng lại ở cấp phân vùng hoặc thực hiện reorgs ở cấp phân vùng (sau khi tắt phân vùng). Bạn cũng có thể gửi các phân vùng khác nhau đến các nhóm fileg khác nhau, nhưng tôi cần cảnh báo bạn rằng làm như vậy sẽ hầu như không bao giờ cải thiện hiệu suất. Filegroups là một tính năng bảo trì. Tăng số lượng tập tin đôi khi có thể cải thiện hiệu suất. Tùy thuộc vào thiết lập lưu trữ của bạn, bạn gần như chắc chắn muốn dữ liệu liên quan đến truy vấn của mình được trải rộng trên nhiều tệp để cải thiện I / O.

  3. Loại bỏ phân vùng bao gồm nhiều kịch bản hơn loại bỏ nhóm hàng trên cùng một cột. Ví dụ: bộ lọc WHERE ID < 0 OR ID > 10sẽ không chất lượng để loại bỏ nhóm hàng nhưng sẽ đủ điều kiện để loại bỏ phân vùng.

  4. Vòng lặp theo phân vùng có thể hữu ích khi thực hiện các hoạt động bảo trì yêu cầu tất cả các hàng phải được thay đổi. Ví dụ: giả sử bạn đang thêm một cột mới vào một bảng có thể được lấy từ các cột hiện có trong bảng đó. Phân vùng cho phép bạn phân chia hiệu quả công việc đó thành các đợt nếu muốn.

Nhược điểm của phân vùng CCI:

  1. Nếu không bảo trì, số lượng hàng trong nhóm hàng delta có thể tăng đáng kể. Hãy xem xét một CCI không liên kết được tải với các phần chèn song song tại MAXDOP 8. Nhiều nhất bạn sẽ có 4194304 hàng trong cửa hàng delta. Nếu bảng được thay đổi để có 50 phân vùng thì giờ đây có thể có 209715200 hàng trong cửa hàng delta.

  2. Các kế hoạch truy vấn để chèn và xóa vào kho lưu trữ cột có thể chứa toán tử sắp xếp là con của toán tử DML. Nếu loại này không thể có đủ bộ nhớ, bạn có thể bị suy giảm hiệu năng cực độ. Tôi khuyên bạn chỉ nên sửa đổi một phân vùng tại một thời điểm nếu sử dụng chèn song song.

  3. Nếu bạn chọn chức năng phân vùng của mình một cách không chính xác, bạn có thể kết thúc với các phân vùng quá nhỏ. Nhiều người sẽ chỉ cho bạn giới hạn hàng 1048576 cho một nhóm hàng là kích thước lý tưởng, nhưng cá nhân tôi cho rằng lợi ích của việc đạt được điều đó là quá mức. Bạn có thể muốn tránh nhiều phân vùng nhỏ nếu bạn có thể giúp nó mặc dù.

  4. Nếu bạn có quá nhiều phân vùng trong bảng hoặc cơ sở dữ liệu của bạn thì điều tồi tệ có thể xảy ra. Thật không may, điều này không được xác định rõ ràng và thật khó để tìm một nguồn đáng tin cậy cho "quá nhiều phân vùng" thực sự có nghĩa là gì. Tôi đã nghe và thấy các vấn đề với thời gian biên dịch truy vấn. Có một câu trả lời gần đây DBCC CHECKTABLElà tốt.

Áp dụng những điều trên vào kịch bản của bạn: với số lượng hàng mà bạn không nên gặp phải bất kỳ trường hợp thực sự xấu nào. Để thực hiện truy vấn, một số người cần thời gian thực hiện truy vấn thực sự nhanh và họ cần bỏ qua càng nhiều nhóm hàng càng tốt. Những người khác chỉ cần một mức loại bỏ nhóm hàng tối thiểu vì hầu hết các công việc được thực hiện trong truy vấn nằm ngoài quét cột của cửa hàng. Điều đó gây khó khăn cho ai đó ở bên ngoài để đưa ra cho bạn một đề xuất về số lượng phân vùng. Đối với bảng 100 triệu, mọi thứ từ 4 - 100 có thể hợp lý.

Bạn có thể thử kiểm tra một số truy vấn của mình với số lượng hàng khác nhau trong các phân vùng để xem hiệu suất thay đổi như thế nào. Điều đó có thể được mô phỏng bằng cách tạo các bản sao của các bảng hoặc bằng cách tạo một hàm phân vùng trên một bảng với độ lệch có chủ ý và thay đổi ID mà bạn lọc theo. Nếu bạn có kết quả nào trong hiệu suất truy vấn đủ tốt và xác minh rằng bạn sẽ không gặp vấn đề gì với việc tải dữ liệu thì bạn sẽ ổn.

Các hàng không liên quan đến câu hỏi, hay đúng hơn, chúng là một câu hỏi hoàn toàn khác. Phân vùng không phải là công cụ phù hợp để cải thiện hiệu suất trên truy vấn của hàng. Tôi đã thấy hiệu suất tăng trên các hệ thống chỉ bằng cách phân vùng các bảng cột và để lại các bảng hàng.


6

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.

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.