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 / 8.1
Tài liệu này dành cho phiên bản không được hỗ trợ của PostgreSQL.
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ế.

Chương 52. Cách kèo bóng đá hôm nay và ngày mai Thống kê

Chương này xây dựng trên vật liệu được bao phủ trongPhần 13.1Phần 13.210529_10782

Mục đích của chương này không phải là ghi lại mã - tốt hơn tốt hơn trong chính mã, nhưng để trình bày một cái nhìn tổng quan về kèo bóng đá hôm nay và ngày mai Nó hoạt động. Điều này có lẽ sẽ giảm bớt đường cong học tập cho ai đó người sau đó muốn đọc mã. Kết quả là, kèo bóng đá hôm nay và ngày mai tiếp cận được chọn là phân tích một loạt các các ví dụ phức tạp.

Các đầu ra và thuật toán được hiển thị bên dưới được lấy từ phiên bản 8.0. Hành vi của các phiên bản sớm hơn (hoặc muộn hơn) có thể thay đổi.

52.1. Ước tính hàng Ví dụ

kèo bóng đá hôm nay và ngày mai các ví dụ được rút ra từ cơ sở dữ liệu kiểm tra hồi quy, 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ế kèo bóng đá hôm nay và ngày mai truy vấn
---------------------------------------------------------------------
 SEQ SCAN trên TENK1 (chi phí = 0,00..445,00 hàng = 10000 chiều rộng = 244)

Cách người lập kế kèo bóng đá hôm nay và ngày mai xác định tính chất của11883_11890được bao phủ trongPhần 13.1, nhưng là lặp đi lặp lại ở đây để hoàn thiện. Số lượng hàng được tra cứu từpg_ class:

12140_12277

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

hàng = 10000

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

Giải thích Chọn * từ Tenk1 trong đó độc đáo1 <1000;

                         Kế kèo bóng đá hôm nay và ngày mai truy vấn
--------------------------------------------------------------------
 SEQ SCAN trên TENK1 (chi phí = 0,00..470.00 hàng = 1031 chiều rộng = 244)
   Bộ lọc: (độc đáo1 <1000)

Người lập kế kèo bóng đá hôm nay và ngày mai kiểm traWHEREĐiều kiện mệnh đề:

độc đáo1 <1000

và tìm kiếm chức năng hạn chế cho kèo bóng đá hôm nay và ngày mai vận hành<inpg_operator. Cái này được giữ trong cộtOprrestvà kèo bóng đá hôm nay và ngày mait quả trong việc này trường hợp làScalarltsel. TheScalarltselHàm lấy Biểu đồ chođộc đáo1từpg_statistic- Chúng ta có thể theo dõi Điều này bằng kèo bóng đá hôm nay và ngày mai sử dụng đơ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 bằng nhau Thùng tần số, vì vậy tất cả những gì chúng ta phải làm là xác định vị trí của thùng rằng giá trị của chúng tôi ở và đếmPhầncủa nó vàtất cảcủa những cái trước. Giá trị 1000 rõ ràng là trong thùng thứ hai (970 - 1943), vì vậy bởi Giả sử phân phối tuyến tính của các giá trị bên trong mỗi nhóm, chúng tôi có thể tính toán độ 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ính của Thứ hai, chia cho số lượng thùng. Số lượng ước tính các hàng hiện có thể được tính là sản phẩm của tính chọn lọc và tính chất củaTENK1:

hàng = 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 trong của nóWHEREmệnh đề:

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

                        Kế kèo bóng đá hôm nay và ngày mai truy vấn
----------------------------------------------------------------------
 SEQ SCAN trên TENK1 (chi phí = 0,00..470.00 hàng = 31 chiều rộng = 244)
   Bộ lọc: (StringU1 = 'ataaaa' :: name)

Một lần nữa người lập kế kèo bóng đá hôm nay và ngày mai kiểm traWHEREĐiều kiện mệnh đề:

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 kèo bóng đá hôm nay và ngày mai để 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, mest_common_freqs từ pg_stats 
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ính chỉ là sản phẩm của điều này với tính chất củaTENK116895_16912

hàng = 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ính 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:

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

                        Kế kèo bóng đá hôm nay và ngày mai truy vấn
----------------------------------------------------------------------
 SEQ SCAN trên TENK1 (chi phí = 0,00..470.00 hàng = 15 chiều rộng = 244)
   Bộ lọc: (StringU1 = 'xxx' :: name)

Đây là một vấn đề khá khác, kèo bóng đá hôm nay và ngày mai ước tính chọn lọc khi giá trị làkhôngTrongMCVDanh sách. kèo bóng đá hôm nay và ngày mai tiếp cận là sử dụng 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 của các 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ố Những điều 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ính được tính như bình thường:

hàng = 10000 * 0,001465
     = 15

Hãy tăng sự 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 trongở đâumệnh đề:

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

                       Kế kèo bóng đá hôm nay và ngày mai truy vấn
-------------------------------------------------------------------
 SEQ SCAN trên TENK1 (chi phí = 0,00..495,00 hàng = 2 chiều rộng = 244)
   Bộ lọc: ((độc đáo1 <1000) và (StringU1 = 'xxx' :: name))

Giả định độc lập được thực hiện và sự chọn lọc của các hạn chế riêng lẻ được nhân với nhau:

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ính hàng được tính như trước:

hàng = 10000 * 0,00015104
     = 2

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

19792_20356

Hạn chế đối vớiTENK1 "độc đáo1 <50"được đánh giá Trước khi tham gia vòng lặp lồng nhau. Điều này được xử lý tương tự Ví dụ phạm vi trước. Toán tử hạn chế cho<Scalarlteqselnhư trước đâ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

hàng = 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 nối được lồng nhau, vớiTenk1Đang ở vòng ngoài. kèo bóng đá hôm nay và ngày mai vận 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ừOprjoin21461_21474pg_operator- và làeqjoinsel21573_21638TENK2tenk1:

21761_22087

Trong trường hợp này không cóMCVThông tin chođộc đáo222226_22416

22451_22620

Đâ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ị. Số lượng hàng mà sự tham gia có khả năng phát ra là được tính là tính chất của sản phẩm Cartesian của hai Các nút trong vòng lặp lồng nhau, nhân với độ chọn lọc:

hàng = (outer_cardinality * Internal_cardinality) * Sự chọn lọc
     = (51 * 10000) * 0,0001
     = 51

Đối với những kèo bóng đá hôm nay và ngày mai quan tâm đến chi tiết hơn, ước tính 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ính toán cho mệnh đề chọn lọc trongsrc/phụ trợ/tối ưu hóa/path/clausesel.c. 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.