Các ví dụ được hiển thị bên dưới sử dụng các bảng trongPostgreSQL9867_1-1 |-1 |19Phân tích
Sử dụng lấy mẫu ngẫu nhiên trong khi tạo ra số liệu thống kê, kết quả sẽ thay đổi một chút sau bất kỳ mới nàoPhân tích
.
Hãy bắt đầu với một truy vấn rất đơn giản:
Giải thích chọn * từ TENK1;
Cách người lập kế hoạch xác định kèo bóng đá cúp c2 chất củaTENK1
được bao phủ trong1-1 |661_1-1 |68-1 |, nhưng được lặp lại ở đây để hoàn thiện. Số lượng trang và kèo bóng đá cúp c2 được tra cứu trongpg_ class
:
1-1 |844_1-1 |981
Những con số này hiện tại là lần cuốiVACUUM
hoặcPhân tích
trên bàn. Sau đó, người lập kế hoạch lấy số lượng trang hiện tại thực tế trong bảng (đây là một hoạt động rẻ tiền, không yêu cầu quét bảng).113-1 |4_11314
sau đóReltuples
được chia tỷ lệ tương ứng để đạt được ước kèo bóng đá cúp c2 số lượng hàng hiện tại. Trong ví dụ trên, giá trị củaRelpages
được cập nhật để ước kèo bóng đá cúp c2 giống như11591_116-1 |2
.
Hãy chuyển sang một ví dụ với điều kiện phạm vi trong11698_117-1 |5
mệnh đề:
Giải thích Chọn * từ Tenk1 trong đó độc đáo1 <1000;
Người lập kế hoạch kiểm traWHERE
Điều kiện mệnh đề và tìm kiếm chức năng chọn lọc cho toán tử<
inpg_operator
. Cái này được giữ trong cộtOprrest
và mục nhập trong trường hợp này làScalarltsel
. TheScalarltsel
Hàm lấy biểu đồ chođộc đáo1
12657_12665pg_statistic
. Đối với các truy vấn thủ công, sẽ thuận tiện hơn để xem xét đơn giản hơnpg_stats
Xem:
Chọn Biểu đồ_Bound từ PG_Stats
13-1 |98_13147Hồi<1-1 |-1 |-1 |132-1 |2_132-1 |5được thực hiện. Đây là kèo bóng đá cúp c2 chọn lọc.Phầncủa nó vàtất cảcủa những cái trước. Giá trị 1000 rõ ràng trong thùng thứ hai (993 Từ1997).
chọn lọc = (1 + (1-1 |-1 |-1 | - xô [2] .min)/(xô [2] .max - xô [2] .min))/num_buckets
nghĩa là, một nhóm toàn bộ cộng với một phần tuyến kèo bóng đá cúp c2 của phần thứ hai, chia cho số lượng thùng. Số lượng hàng ước kèo bóng đá cúp c2 hiện có thể được kèo bóng đá cúp c2 là sản phẩm của kèo bóng đá cúp c2 chọn lọc và kèo bóng đá cúp c2 toán củaTENK1
:
kèo bóng đá cúp c2 = rel_cardinality * chọn lọc
Tiếp theo hãy xem xét một ví dụ với điều kiện bình đẳng trongWHERE
mệnh đề:
Giải thích Chọn * từ Tenk1 trong đó StringU1 = 'craaaa';
Một lần nữa người lập kế hoạch kiểm traWHERE
Điều kiện mệnh đề và tìm kiếm chức năng chọn lọc cho=
, đó làEQSEL
. Đối với ước kèo bóng đá cúp c2 bình đẳng, biểu đồ không hữu ích;Giá trị phổ biến nhất(MCV15-1 |1-1 |_15139
Chọn n_distince |, n_distince, most_common_vals, mest_common_freqs từ pg_stats
15542_1555-1 |craaaa
Xuất hiện trong danh sách MCV, kèo bóng đá cúp c2 chọn lọc chỉ đơn thuần là mục nhập tương ứng trong danh sách các tần số phổ biến nhất (MCFs):
chọn lọc = MCF [3]
Như trước đây, số lượng hàng ước kèo bóng đá cúp c2 chỉ là sản phẩm của điều này với kèo bóng đá cúp c2 chất củaTENK1
:
kèo bóng đá cúp c2 = 1-1 |-1 |-1 |-1 | * -1 |,-1 |-1 |3
16-1 |42_16112MCVDanh sách:
Giải thích Chọn * từ Tenk1 trong đó StringU1 = 'XXX';
Đây là một vấn đề khá khác: Cách ước kèo bóng đá cúp c2 độ chọn lọc khi giá trị làkhôngtrongMCVDanh sách. Cách tiếp cận là sử dụng thực tế là giá trị không có trong danh sách, kết hợp với kiến thức về tần số cho tất cả cácMCV1679-1 |_16794
chọn lọc = (1 - sum (mvf))/(num_distince - num_mcv)
nghĩa là thêm tất cả các tần số choMCVS và trừ chúng khỏi một, sau đó chia cho số lượngkhácGiá trị riêng biệt. Số tiền này để giả định rằng tỷ lệ của cột không phải là bất kỳ MCV nào được phân phối đều trong số tất cả các giá trị riêng biệt khác.
kèo bóng đá cúp c2 = 1-1 |-1 |-1 |-1 | * -1 |,-1 |-1 |14559
Ví dụ trước vớiđộc đáo1 <1-1 |-1 |-1 |
là một sự đơn giản hóa quá mức của những gìScalarltsel
Thực sự; Bây giờ chúng ta đã thấy một ví dụ về việc sử dụng MCV, chúng ta có thể điền vào một số chi tiết hơn.18-1 |35_18-1 |44
là một cột duy nhất mà nó không có MCV (rõ ràng, không có giá trị nào phổ biến hơn bất kỳ giá trị nào khác). Đối với một cột không duy nhất, thông thường sẽ có cả biểu đồ và danh sách MCV vàBiểu đồ không bao gồm phần quần thể cột được đại diện bởi MCVS. Chúng tôi làm mọi thứ theo cách này bởi vì nó cho phép ước kèo bóng đá cúp c2 chính xác hơn.Scalarltsel
18489_1853-1 |<1-1 |-1 |-1 |) cho mỗi giá trị của danh sách MCV và thêm tần số của MCV mà điều kiện là đúng. Điều này đưa ra một ước kèo bóng đá cúp c2 chính xác về kèo bóng đá cúp c2 chọn lọc trong phần của bảng là MCV.
Giải thích Chọn * từ Tenk1 trong đó StringU1 <'IAAAAA';
Chúng ta đã thấy thông tin MCV choStringU1
, Và đây là biểu đồ của nó:
Chọn Biểu đồ_Bound từ PG_Stats
Kiểm tra danh sách MCV, chúng tôi thấy rằng điều kiệnStringU1 <'IAAAAA'
được thỏa mãn bởi sáu mục đầu tiên và không phải là bốn mục cuối cùng, vì vậy kèo bóng đá cúp c2 chọn lọc trong phần MCV của dân số là
2-1 |-1 |33_2-1 |159
2-1 |169_2-1 |445IAAAAA
rơi gần ở cuối nhóm biểu đồ thứ ba. Sử dụng một số giả định khá nhảm nhí về tần suất của các ký tự khác nhau, người lập kế hoạch đến ước kèo bóng đá cúp c2 -1 |,298387 cho phần quần thể biểu đồ nhỏ hơnIAAAAA
. Sau đó, chúng tôi kết hợp các ước kèo bóng đá cúp c2 cho quần thể MCV và không phải MCV:
electivity = mcv_selectivity + Biểu đồ
21-1 |88_21555
Bây giờ hãy xem xét một trường hợp có nhiều hơn một điều kiện trongWHERE
mệnh đề:
Giải thích Chọn * từ TENK1 trong đó độc đáo1 <1-1 |-1 |-1 | và StringU1 = 'xxx';
Người lập kế hoạch giả định rằng hai điều kiện là độc lập, để các lựa chọn riêng lẻ của các mệnh đề có thể được nhân với nhau:
chọn lọc = chọn lọc (độc đáo1 <1-1 |-1 |-1 |) * chọn lọc (StringU1 = 'xxx')
2257-1 |_22789
Cuối cùng chúng tôi sẽ kiểm tra một truy vấn liên quan đến tham gia:
Giải thích Chọn * Từ Tenk1 T1, Tenk2 T2
23566_21-1 |-1 |-1 |-1 |7TENK1
, độc đáo1 <5-1 |
, được đánh giá trước khi nối vòng lồng nhau. Điều này được xử lý tương tự với ví dụ phạm vi trước đó.độc đáo1
Biểu đồ:
Chọn lọc = (-1 | + (5-1 | - Xô [1] .Min)/(Xô [1] .Max - Xô [1] .Min))
Hạn chế cho sự tham gia làt2.Unique2 = t1.unique2
. Người vận hành chỉ là quen thuộc của chúng tôi=
Tuy nhiên, hàm chọn lọc được lấy từOprjoin
Cột củapg_operator
và làeqjoinsel
. eqjoinsel
Xem lên thông tin thống kê cho cả haitenk2
và-1 | |
:
24694_25-1 |17
Trong trường hợp này không có25-1 |77_25-1 |82Thông tin chođộc đáo2
Bởi vì tất cả các giá trị dường như là duy nhất, vì vậy chúng tôi sử dụng một thuật toán chỉ dựa vào số lượng các giá trị riêng biệt cho cả hai mối quan hệ cùng với các phân số null của chúng:
25354_2552-1 |
Đây là, trừ phần null từ một cho mỗi mối quan hệ và chia cho tối đa số lượng các giá trị riêng biệt. Số lượng hàng mà sự tham gia có khả năng phát ra được kèo bóng đá cúp c2 bằng kèo bóng đá cúp c2 toán của sản phẩm Cartesian của hai đầu vào, nhân với độ chọn lọc:
kèo bóng đá cúp c2 = (outer_cardinality * Inside_cardinality) * chọn lọc
25969_26-1 |17eqjoinsel
Đã sử dụng so sánh trực tiếp các danh sách MCV để xác định độ chọn lọc nối trong phần quần thể cột được đại diện bởi MCV. Ước kèo bóng đá cúp c2 cho phần còn lại của quần thể theo cùng một cách tiếp cận được hiển thị ở đây.
263-1 |4_26328Inside_cardinality
AS 1-1 |-1 |-1 |-1 |, nghĩa là kích thước không biến đổi củaTenk2
. Nó có thể xuất hiện từ việc kiểm traGiải thích
26529_26695TENK2
. Nhưng đây không phải là trường hợp: Kích thước quan hệ tham gia được ước kèo bóng đá cúp c2 trước khi bất kỳ kế hoạch tham gia cụ thể nào được xem xét.
27-1 |51_2714-1 |WHERE
mệnh đề) được thực hiện trongsrc/phụ trợ/tối ưu hóa/util/plancat.c
. Logic chung cho mệnh đề chọn lọc trongsrc/phụ trợ/tối ưu hóa/path/clausesel.c
. Các chức năng chọn lọc dành riêng cho toán tử chủ yếu được tìm thấy trongSRC/Backend/Utils/ADT/Selfuncs.c
.
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ớpMẫu nàyĐể báo cáo vấn đề tài liệu.