Tương quan đa biến có thể được thể hiện bằng một tập dữ liệu rất đơn giản - một bảng có hai cột, cả hai đều chứa cùng một giá trị:
Tạo bảng T (A int, B int); Chèn vào T Chọn i % 100, i % 100 từ Generate_Series (1, 10000) S (i); Phân tích T;
Như đã giải thích trongPhần 14.2, Người lập kế hoạch có thể xác định tính chất củaT
Sử dụng số lượng trang và hàng thu được từpg_ class
:
Chọn Relpages, Reltuples từ pg_class trong đó relname = 't'; Relpages | Reltuples ----------+----------- 45 | 10000
Phân phối dữ liệu rất đơn giản; Chỉ có 100 giá trị riêng biệt trong mỗi cột, được phân phối đồng đều.
Ví dụ sau đây cho thấy kết quả của việc ước tính AWHERE
điều kiện trênA
cột:
Giải thích (phân tích, tắt thời gian) chọn * từ t trong đó a = 1; Kế hoạch truy vấn ---------------------------------------------------------------------------------------- SEQ Scan trên t (chi phí = 0,00..170.00 hàng = 100 chiều rộng = 8) (hàng thực = 100 vòng = 1) Bộ lọc: (a = 1) Hàng bị xóa bởi bộ lọc: 9900
Người lập kế hoạch kiểm tra điều kiện và xác định tính chọn lọc của mệnh đề này là 1%. Bằng cách so sánh ước tính này và số lượng hàng thực tế, chúng tôi thấy rằng ước tính là rất chính xác (thực tế chính xác, vì bảng rất nhỏ). Thay đổiWHERE
Điều kiện sử dụngB
Cột, một kế hoạch giống hệt nhau được tạo. Nhưng quan sát những gì xảy ra nếu chúng ta áp dụng cùng một điều kiện trên cả hai cột, kết hợp chúng vớivà
:
Giải thích (phân tích, tắt thời gian) chọn * từ t trong đó a = 1 và b = 1; Kế hoạch truy vấn ----------------------------------------------------------------------- -------------- SEQ SCAN trên t (chi phí = 0,00..195,00 hàng = 1 chiều rộng = 8) (hàng thực = 100 vòng = 1) Bộ lọc: ((a = 1) và (b = 1)) Hàng bị xóa bởi bộ lọc: 9900
Người lập kế hoạch ước tính tính chọn lọc cho từng điều kiện riêng lẻ, đến cùng ước tính 1% như trên. Sau đó, nó giả định rằng các điều kiện là độc lập, và do đó, nó nhân lên tính chọn lọc của chúng, tạo ra ước tính chọn lọc cuối cùng chỉ là 0,01%. Đây là một sự đánh giá thấp đáng kể, vì số lượng hàng thực tế phù hợp với các điều kiện (100) là hai bậc cao hơn.
Vấn đề này có thể được khắc phục bằng cách tạo một đối tượng kèo bóng đá hom nay kê chỉ đạoPhân tích
Để tính toán số liệu kèo bóng đá hom nay phụ thuộc chức năng trên hai cột:
Tạo Stts kèo bóng đá hom nay kê (phụ thuộc) trên A, B từ T; Phân tích t; Giải thích (phân tích, tắt thời gian) chọn * từ t trong đó a = 1 và b = 1; Kế hoạch truy vấn ---------------------------------------------------------------------------------------- SEQ SCAN trên t (chi phí = 0,00..195,00 hàng = 100 chiều rộng = 8) (hàng thực = 100 vòng = 1) Bộ lọc: ((a = 1) và (b = 1)) Hàng bị xóa bởi bộ lọc: 9900
Một vấn đề tương tự xảy ra với ước tính tính toán của các bộ của nhiều cột, chẳng hạn như số lượng nhóm sẽ được tạo bởi ANhóm bởi
mệnh đề. KhiNhóm bởi
13019_13172
Giải thích (Phân tích, Tắt thời gian) Chọn Đếm (*) từ nhóm T bằng a; Kế hoạch truy vấn ----------------------------------------------------------------------- ---------------------------------- Hashaggregate (chi phí = 195.00..196.00 hàng = 100 chiều rộng = 12) (hàng thực = 100 vòng = 1) Khóa nhóm: a - SEQ SCAN trên t (chi phí = 0,00..145,00 hàng = 10000 chiều rộng = 4) (hàng thực = 10000 vòng = 1)
Nhưng không có kèo bóng đá hom nay, ước tính số lượng nhóm trong truy vấn có hai cột trongNhóm bởi
, như trong ví dụ sau, bị tắt theo thứ tự độ lớn:
Giải thích (phân tích, tắt thời gian) Chọn đếm (*) từ nhóm T bằng a, b; Kế hoạch truy vấn ----------------------------------------------------------------------- ----------------------------- Hashaggregate (chi phí = 220.00..230.00 hàng = 1000 chiều rộng = 16) (hàng thực = 100 vòng = 1) Khóa nhóm: A, B - SEQ SCAN trên t (chi phí = 0,00..145,00 hàng = 10000 chiều rộng = 8) (hàng thực = 10000 vòng = 1)
Bằng cách xác định lại đối tượng kèo bóng đá hom nay kê để bao gồm số lượng phân loại n cho hai cột, ước tính được cải thiện nhiều:
kèo bóng đá hom nay kê STTS; Tạo Stts kèo bóng đá hom nay kê (phụ thuộc, ndistince) trên a, b từ t; Phân tích t; Giải thích (Phân tích, Tắt thời gian) Chọn Đếm (*) từ nhóm T bằng a, b; Kế hoạch truy vấn ----------------------------------------------------------------------- ----------------------------- Hashaggregate (chi phí = 220.00..221.00 hàng = 100 chiều rộng = 16) (hàng thực = 100 vòng = 1) Khóa nhóm: A, B - SEQ SCAN trên t (chi phí = 0,00..145,00 hàng = 10000 chiều rộng = 8) (hàng thực = 10000 vòng = 1)
Như được giải thích trongPhần 76.2.1, Phụ thuộc chức năng là loại kèo bóng đá hom nay kê rất rẻ và hiệu quả, nhưng giới hạn chính của chúng là bản chất toàn cầu của chúng (chỉ theo dõi các phụ thuộc ở cấp độ cột, không phải giữa các giá trị cột riêng lẻ).
Phần này giới thiệu biến thể đa biến củaMCV(giá trị phổ biến nhất) danh sách, một phần mở rộng đơn giản của các số liệu kèo bóng đá hom nay kê trên cột được mô tả trongPhần 76.1. Những kèo bóng đá hom nay kê này giải quyết giới hạn bằng cách lưu trữ các giá trị riêng lẻ, nhưng nó tự nhiên đắt hơn, cả về mặt xây dựng số liệu kèo bóng đá hom nay kê trongPhân tích
, Thời gian lưu trữ và lập kế hoạch.
Hãy xem truy vấn từPhần 76.2.1Một lần nữa, nhưng lần này với AMCVDanh sách được tạo trên cùng một tập hợp các cột (đảm bảo bỏ các phụ thuộc chức năng, để đảm bảo người lập kế hoạch sử dụng số liệu kèo bóng đá hom nay kê mới được tạo).
kèo bóng đá hom nay kê Drop Stts; Tạo số liệu kèo bóng đá hom nay kê STTS2 (MCV) trên A, B từ T; Phân tích t; Giải thích (phân tích, tắt thời gian) chọn * từ t trong đó a = 1 và b = 1; Kế hoạch truy vấn ---------------------------------------------------------------------------------------- SEQ SCAN trên t (chi phí = 0,00..195,00 hàng = 100 chiều rộng = 8) (hàng thực = 100 vòng = 1) Bộ lọc: ((a = 1) và (b = 1)) Hàng bị xóa bởi bộ lọc: 9900
Ước tính chính xác như với các phụ thuộc chức năng, chủ yếu là nhờ bảng khá nhỏ và có phân phối đơn giản với số lượng giá trị riêng biệt thấp. Trước khi xem truy vấn thứ hai, không được xử lý bởi các phụ thuộc chức năng đặc biệt tốt, hãy kiểm traMCVLiệt kê một chút.
Kiểm traMCVDanh sách có thể sử dụngPG_MCV_LIST_ITEMS
Hàm hoàn trả lại.
Chọn m.* Từ pg_statistic_ext tham gia pg_statistic_ext_data trên (oid = stxoid), pg_mcv_list_items (stxdmcv) m trong đó stxname = 'stts2'; Chỉ mục | Giá trị | NULLS | tần số | base_frequency -------+----------+-------+-----------+-------------------- 0 | 0, 0 | f, f | 0,01 | 0,0001 1 | 1, 1 | f, f | 0,01 | 0,0001 ... 49 | 49, 49 | f, f | 0,01 | 0,0001 50 | 50, 50 | f, f | 0,01 | 0,0001 ... 97 | 97, 97 | f, f | 0,01 | 0,0001 98 | 98, 98 | f, f | 0,01 | 0,0001 99 | 99, 99 | f, f | 0,01 | 0,0001 (100 hàng)
Điều này xác nhận có 100 kết hợp riêng biệt trong hai cột và tất cả chúng đều có khả năng như nhau (tần số 1% cho mỗi cột). Tần số cơ sở là tần số được tính toán từ các kèo bóng đá hom nay kê trên mỗi cột, như thể không có số liệu kèo bóng đá hom nay kê nhiều cột. Nếu có bất kỳ giá trị null nào trong một trong các cột, điều này sẽ được xác định trongNULLS
Cột.
Khi ước tính tính chọn lọc, người lập kế hoạch áp dụng tất cả các điều kiện trên các mục trongMCVDanh sách, sau đó tổng hợp các tần số của các kết hợp. Nhìn thấymcv_clauselist_selectivity
insrc/phụ trợ/kèo bóng đá hom nay kê/mcv.c
Để biết chi tiết.
So với phụ thuộc chức năng,MCVDanh sách có hai lợi thế chính. Đầu tiên, danh sách lưu trữ các giá trị thực tế, cho phép quyết định kết hợp nào tương thích.
Giải thích (phân tích, tắt thời gian) chọn * từ t trong đó a = 1 và b = 10; Kế hoạch truy vấn ----------------------------------------------------------------------- -------- Quét SEQ trên t (chi phí = 0,00..195.00 hàng = 1 chiều rộng = 8) (hàng thực = 0 vòng = 1) Bộ lọc: ((a = 1) và (b = 10)) Hàng bị xóa bởi bộ lọc: 10000
Thứ hai,MCVDanh sách xử lý một phạm vi rộng hơn các loại mệnh đề, không chỉ các mệnh đề bình đẳng như phụ thuộc chức năng. Ví dụ: hãy xem xét truy vấn phạm vi sau cho cùng một bảng:
Giải thích (phân tích, tắt thời gian) chọn * từ t trong đó a <= 49 và b 49; Kế hoạch truy vấn ----------------------------------------------------------------------- -------- Quét SEQ trên t (chi phí = 0,00..195.00 hàng = 1 chiều rộng = 8) (hàng thực = 0 vòng = 1) Bộ lọc: ((a <= 49) và (b 49)) Hàng bị xóa bởi bộ lọc: 10000
Nếu bạn thấy bất cứ điều gì trong tài liệu không chính xác, không khớp Kinh nghiệm của bạn với tính năng cụ thể hoặc yêu cầu làm rõ thêm, Vui lòng sử dụngMẫu nàyĐể báo cáo vấn đề tài liệu.