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 AUDIT
có TenantId
cộ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 WHERE
mệnh đề với một TenantId
tham 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 TenantId
cộ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) Chỉ mục Bitmap: 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?