Có đáng để phân vùng Bảng theo giá trị đơn trong Oracle không?


7

Thông thường, nếu bạn có một cột mà bạn thường xuyên truy vấn một bảng, bạn nên dán một chỉ mục trên đó. Nhưng nó có đáng để phân vùng một bảng theo cột này không, nếu tất cả các giá trị có thể được biết trước? Giả sử bạn có một bảng AUDITTenantIdcột chỉ có thể tạo các giá trị: 1, 2 . Tất cả các SELECT câu lệnh sẽ có một WHEREmệnh đề với một TenantIdtham số.

Vì vậy, nó có lợi khi phân vùng bảng này bằng TenantId? Nếu vậy, bạn cũng sẽ tạo một chỉ mục trên TenantIdcột?

partition by list (TENANTID)
(
  partition TENANT1 values (1),
  partition TENANT2 values (2)
)

Tôi đã thực hiện một thử nghiệm nhỏ: chèn các bản ghi 1M với TenantId được tạo ngẫu nhiên, do đó tạo:

  • 499652 hồ sơ với TenantId = 1
  • 500348 hồ sơ với TenantId = 2

Dưới đây là các kế hoạch truy vấn cho câu lệnh:

SELECT * FROM table1 WHERE TENANTID=2

Bảng đơn giản (không có chỉ mục, không có phân vùng) Kế hoạch truy vấn bảng đơn giản Chỉ mục Bitmap: Kế hoạch truy vấn Bitmap Index Phân vùng: Kế hoạch truy vấn phân vùng

Btw, trong trường hợp tôi có cả hai, chỉ mục và phân vùng, kế hoạch truy vấn sử dụng phân vùng chứ không phải chỉ mục, do đó kế hoạch trông giống hệt như kế hoạch thứ 2 được hiển thị ở trên.

Rõ ràng phân vùng thắng, nhưng nó? Rõ ràng, cột chi phí trong một kế hoạch thực hiện không phải là một cách đáng tin cậy để đánh giá chi phí thực của thời gian phản hồi câu lệnh SQL .

Vì vậy, cách tốt nhất sau đó là gì? Làm thế nào để chọn cái này qua cái khác?


Tôi đã cập nhật câu trả lời của mình để đáp ứng với cập nhật của bạn.
Florin Ghita

Câu trả lời:


4

Ý kiến ​​của tôi là phân vùng của bảng đó theo cách trình bày thể hữu ích.

Các truy vấn của bạn sẽ nhanh hơn hai lần (trong trường hợp khi các phân vùng gần như bằng nhau) nếu chúng thực hiện quét toàn bộ.

Trong trường hợp các truy vấn của bạn có một giai điệu khác của các bộ lọc / điều kiện và sử dụng các chỉ mục, phân vùng không hữu ích, vì mức độ của một chỉ mục gần như không bị ảnh hưởng bằng cách nhân đôi số lượng giá trị.

CẬP NHẬT : Đối với bài kiểm tra bạn đã làm ( SELECT * FROM table1 WHERE TENANTID=2) chắc chắn rằng phân vùng là tốt nhất. Giải pháp bitmap cần quét chỉ mục và sau đó, để quét tất cả các khối của bảng có chứa các hàng với tenantid=2(nó biết các hàng là gì). Nhưng phân vùng sẽ khiến chỉ quét phân vùng của bảng với tenantid = 2. Chúng được phân tách theo từng nhóm tenantid=1.

Vì vậy, hai lần quét (quét chỉ mục + quét bảng) so với quét một bảng (có thể nhỏ hơn).


3

Khi một cột chứa một vài giá trị riêng biệt, còn gọi là cardinality thấp, như trong trường hợp của bạn, bạn nên tạo một chỉ mục Bitmap trên đó. Khi bạn thường xuyên truy vấn theo cột đó, đó là.

Dưới đây là thông tin thêm về Chỉ mục Bitmap của Oracle: http://www.dba-oracle.com/oracle_tips_bitmapped_indexes.htmlm


Cảm ơn, tôi đã thực hiện một thử nghiệm nhỏ ở đây với 1M hàng: 500348 với TENANTID = 2, 499652 với TENANTID = 1 được phân phối ngẫu nhiên và theo QUERY PLAN, bảng được phân vùng có chi phí nhỏ hơn (1112 so với 1521) so với bitmap được lập chỉ mục . Làm thế nào bạn sẽ giải thích nó?
Грозный

Bạn có thể gửi câu hỏi của bạn ở đây
Henrique Ordine

xin vui lòng xem bản chỉnh sửa
érégôgôgôgô

Một chỉ mục bitmap có thể không phải là một lựa chọn tốt nếu bảng được cập nhật thường xuyên (và đồng thời)
a_horse_with_no_name

@Tsar, tôi thấy rằng bạn đã kết luận rằng cột Chi phí mà bạn đang xem hóa ra không đáng tin cậy, vì vậy tôi đoán tôi không phải giải thích bất cứ điều gì cho bạn về vấn đề chèo thuyền.
Henrique Ordine
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.