Phiên bản được hỗ trợ:hiện tại(17) /16 / 15 / 14 / 13
Phiên bản phát triển:18 / Devel
Phiên bản không được hỗ trợ:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2
8719_8790
Bạn có thể muốn xem cùng một trang chohiện tạiPhiên bản hoặc một trong các phiên bản được hỗ trợ khác được liệt kê ở trên thay thế.

54.1. Ước tỷ lệ kèo bóng đá 88 Ví dụ

Sử tỷ lệ kèo bóng đá 88ng các ví dụ được rút ra từ cơ sở dữ liệu kiểm tra hồi quy, hãy để chúng ta 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;

                         Kế hoạch truy vấn
---------------------------------------------------------------------
 SEQ SCAN trên TENK1 (chi phí = 0,00..445,00 tỷ lệ kèo bóng đá 88 = 10000 chiều rộng = 244)

Cách người lập kế hoạch xác định tỷ lệ kèo bóng đá 88 chất củatenk1được bao phủ trongPhần 13.1, nhưng được lặp lại ở đây cho hoàn chỉnh. Số lượng tỷ lệ kèo bóng đá 88 được tra cứu từpg_ class:

10802_10939

Người lập kế hoạch sẽ kiểm traRelpagesƯớc tỷ lệ kèo bóng đá 88 (đây là một hoạt động giá rẻ) và nếu không chính xác có thể tỷ lệReltuplesĐể có được ước tỷ lệ kèo bóng đá 88. Trong trường hợp này, nó không, do đó:

tỷ lệ kèo bóng đá 88 = 10000

Hãy chuyển sang một ví dụ với điều kiện phạm vi trongWHEREmệnh đề:

11377_11622

Người lập kế hoạch kiểm traWHEREmệnh đề tình trạng:

độc đáo1 <1000

Và tìm kiếm chức năng hạn chế cho người vận hành<inpg_operator. Cái này được giữ trong cộtOprrestvà kết quả trong trường hợp này làScalarltsel. TheScalarltselHàm lấy biểu đồ vìđộc đáo1từpg_statistic- Chúng ta có thể theo dõi điều này bằng cách sử tỷ lệ kèo bóng đá 88ng đơn giản hơnpg_statsXem:

Chọn Biểu đồ_bound từ PG_Stats 
Trong đó tablename = 'tenk1' và attname = 'độc đáo1';

                   Biểu đồ_bound
------------------------------------------------------------------
 1,970,1943,2958,3971,5069,6028,7007,7919,8982,9995

Tiếp theo tỷ lệ của biểu đồ bị chiếm bởi"<1000"được thực hiện. Đây là chọn lọc. Biểu đồ chia phạm vi thành tần số bằng nhau Xô, vì vậy tất cả những gì chúng ta phải làm là định vị xô mà giá trị của chúng ta đang ở và đếmPhầncủa nó vàtất cảcủa những người trước. Giá trị 1000 rõ ràng trong lần thứ hai (970 - 1943) Xô, vì vậy bằng cách giả sử phân phối tuyến tỷ lệ kèo bóng đá 88 của các giá trị bên trong Mỗi thùng chúng ta có thể tỷ lệ kèo bóng đá 88 toán tỷ lệ kèo bóng đá 88 chọn lọc là:

chọn lọc = (1 + (1000 - bckt [2] .min)/(bckt [2] .max - bckt [2] .min))/num_bckts
            = (1 + (1000 - 970)/(1943 - 970))/10
            = 0.1031

nghĩa là, một nhóm toàn bộ cộng với một phần tuyến tỷ lệ kèo bóng đá 88 của Thứ hai, chia cho số lượng thùng. Số lượng ước tỷ lệ kèo bóng đá 88 của Hàng hiện có thể được tỷ lệ kèo bóng đá 88 là sản phẩm của tỷ lệ kèo bóng đá 88 chọn lọc và Cardinality củaTenk1:

tỷ lệ kèo bóng đá 88 = rel_cardinality * chọn lọc
     = 10000 * 0.1031
     = 1031

Tiếp theo hãy xem xét một ví dụ với điều kiện bình đẳng trongWHEREmệnh đề:

Giải thích Chọn * từ Tenk1 trong đó StringU1 = 'Ataaaa';

                        Kế hoạch truy vấn
----------------------------------------------------------------------
 SEQ SCAN trên TENK1 (chi phí = 0,00..470.00 tỷ lệ kèo bóng đá 88 = 31 chiều rộng = 244)
   Bộ lọc: (StringU1 = 'ataaaa' :: name)

Một lần nữa người lập kế hoạch kiểm traWHERE14193_14215

StringU1 = 'Ataaaa'

và tìm kiếm chức năng hạn chế cho=, đó làeqsel. Trường hợp này hơi khác một chút, vì các giá trị phổ biến nhất -​​MCVs, được sử tỷ lệ kèo bóng đá 88ng để xác định sự chọn lọc. Chúng ta hãy xem những cái này, với một số các cột sẽ hữu ích sau:

Chọn Null_Frac, N_Distince, Most_Common_Vals, Most_Common_FREQS từ 
Trong đó tablename = 'tenk1' và attname = 'StringU1';

null_frac | 0
n_distince | 672
Hầu hết_common_vals | Fdaaaa, nhaaaa, ataaaa, bgaaaa, ebaaaa, moaaaa, ndaaaa, owaaaa, bhaaaa, bjaaaa

Độ chọn lọc chỉ là tần số phổ biến nhất (MCF) tương ứng với Thứ baMCV- 'Ataaaa':

Chọn lọc = MCF [3]
            = 0,003

Số lượng hàng ước tỷ lệ kèo bóng đá 88 chỉ là sản phẩm của điều này với Cardinality củaTENK1như trtỷ lệ kèo bóng đá 88:

tỷ lệ kèo bóng đá 88 = 10000 * 0,003
     = 30

Số được hiển thị bởiGiải thíchIS nhiều hơn thế này, do một số kiểm tra ước tỷ lệ kèo bóng đá 88 bài đăng.

Bây giờ hãy xem xét cùng một truy vấn, nhưng với một hằng số không trongMCVDanh sách:

15797_16041

Đây là một vấn đề khá khác, cách ước tỷ lệ kèo bóng đá 88 chọn lọc khi giá trị làkhông16187_16197MCVDanh sách. Cách tiếp cận là sử tỷ lệ kèo bóng đá 88ng thực tế rằng giá trị không nằm trong danh sách, kết hợp với kiến ​​thức về tần số cho tất cảMCVS:

chọn lọc = (1 - sum (mvf))/(num_distince - num_mcv)
            = (1 - (0,00333333 + 0,00333333 + 0,003 + 0,003 + 0,003 
            + 0,003 + 0,003 + 0,003 + 0,0026667 + 0,0026667))/(672 - 10)
            = 0,001465

nghĩa là thêm tất cả các tần số choMCVS và trừ chúng khỏi một - bởi vì nó làkhôngMột trong số này, và chia chocòn lạiGiá trị riêng biệt. Để ý rằng không có giá trị null nên chúng tôi không phải lo lắng về những thứ kia. Số lượng hàng ước tỷ lệ kèo bóng đá 88 được tỷ lệ kèo bóng đá 88 như bình thường:

tỷ lệ kèo bóng đá 88 = 10000 * 0,001465
     = 15

Hãy tăng độ phức tạp để xem xét một trường hợp có nhiều hơn hơn một điều kiện trongWHEREmệnh đề:

Giải thích Chọn * từ TENK1 trong đó độc đáo1 <1000 và StringU1 = 'xxx';

                       Kế hoạch truy vấn
-------------------------------------------------------------------
 SEQ SCAN trên TENK1 (chi phí = 0,00..495,00 tỷ lệ kèo bóng đá 88 = 2 chiều rộng = 244)
   Bộ lọc: ((độc đáo1 <1000) và (StringU1 = 'xxx' :: name))

17652_17771

chọn lọc = chọn lọc (độc đáo1 <1000) * chọn lọc (StringU1 = 'xxx')
            = 0,1031 * 0,001465
            = 0,00015104

Ước tỷ lệ kèo bóng đá 88 được tính như trước:

tỷ lệ kèo bóng đá 88 = 10000 * 0,00015104
     = 2

Cuối cùng chúng tôi sẽ kiểm tra một truy vấn bao gồm mộttham giacùng với AWHEREmệnh đề:

18252_18816

Hạn chế đối vớiTENK1 "độc đáo1 <50"được đánh giá trtỷ lệ kèo bóng đá 88 đó Các vòng lặp lồng nhau tham gia. Điều này được xử lý tương tự với trtỷ lệ kèo bóng đá 88 đó Ví dụ phạm vi. Toán tử hạn chế cho<Scalarlteqselnhư trtỷ lệ kèo bóng đá 88 đây, nhưng lần này Giá trị 50 nằm trong thùng đầu tiên củađộc đáo1Biểu đồ:

chọn lọc = (0 + (50 - bckt [1] .min)/(bckt [1] .max - bckt [1] .min))/num_bckts
            = (0 + (50 - 1)/(970 - 1))/10
            = 0,005057

tỷ lệ kèo bóng đá 88 = 10000 * 0,005057
            = 51

Hạn chế cho sự tham gia là:

t2.Unique2 = t1.unique2

Điều này là do phương thức tham gia được lồng nhau, vớiTENK1đang ở trong vòng lặp bên ngoài. Các Nhà điều hành chỉ là quen thuộc của chúng tôi=Tuy nhiên Chức năng hạn chế được lấy từOprjoinCột củapg_operator- và làeqjoinsel. Ngoài ra, chúng tôi sử tỷ lệ kèo bóng đá 88ng thống kê thông tin cho cả haiTENK2tenk1:

Chọn TableName, NULL_FRAC, N_DISTINC 
Trong đó các tablename trong ('tenk1', 'tenk2') và attname = 'độc đáo2';  

TableName | null_frac | n_distince | Hầu hết_common_vals
-----------+-----------+------------+----------------------
 tenk1 |         0 |         -1 |
 tenk2 |         0 |         -1 |

Trong trường hợp này không cóMCVThông tin chođộc đáo2Vì tất cả các giá trị dường như là duy nhất, vì vậy chúng ta có thể sử tỷ lệ kèo bóng đá 88ng một thuật toán chỉ dựa vào số của các giá trị riêng biệt cho cả hai mối quan hệ cùng với null của họ Phân số:

20850_21019

Đây là, trừ phần null từ một cho mỗi quan hệ và chia cho tối đa của hai giá trị riêng biệt. Số lượng hàng mà sự tham gia có khả năng phát ra được tỷ lệ kèo bóng đá 88 toán là tỷ lệ kèo bóng đá 88 chất của sản phẩm Cartesian của hai nút trong Nested-loop, nhân với độ chọn lọc:

tỷ lệ kèo bóng đá 88 = (outer_cardinality * Inside_cardinality) * chọn lọc
     = (51 * 10000) * 0,0001
     = 51

Đối với những người quan tâm đến các chi tiết khác, ước tỷ lệ kèo bóng đá 88 của Số lượng hàng trong một mối quan hệ được bao phủ trongsrc/phụ trợ/tối ưu hóa/util/plancat.c. Các logic tỷ lệ kèo bóng đá 88 toán cho mệnh đề chọn lọc trong21735_21775. Các Việc triển khai thực tế của nhà điều hành và tham gia hạn chế Các chức năng có thể được tìm thấy trongsrc/backend/utils/adt/selfuncs.c.