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
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ế.

56.1. Ví dụ về ước soi kèo bóng đá truoctran

Các ví dụ được hiển thị bên dưới sử soi kèo bóng đá truoctranng các bảng trongPostgreSQLCơ sở dữ liệu kiểm tra hồi quy. Các Đầu ra hiển thị được lấy từ phiên bản 8.3. Hành vi của sớm hơn (Hoặc sau này) Các phiên bản có thể khác nhau. Cũng lưu ý rằng vìPhân tíchSử soi kèo bóng đá truoctranng lấy mẫu ngẫu nhiên trong khi sản xuất 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;

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

Cách người lập kế hoạch xác định soi kèo bóng đá truoctran chất củaTenk1được bao phủ trongPhần 14.2, nhưng được lặp lại ở đây cho hoàn chỉnh. Số lượng trang và soi kèo bóng đá truoctran được tra cứu trongpg_ class:

11115_11252

Những con số này hiện tại là lần cuốiNút húthoặcPhân tíchTrên bàn. Người lập kế hoạch sau đó lấy số lượng hiện tại thực tế của các trang trong bảng (đây là một hoạt động rẻ, không yêu cầu quét bảng). Nếu điều đó khác vớiRelpagessau đóReltuplesđược chia tỷ lệ tương ứng để đến Ước tính số lượng hàng hiện tại. Trong trường hợp này, các giá trị là đúng để ước soi kèo bóng đá truoctran giống nhưReltuples.

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ế hoạch truy vấn
------------------------------------------------------------------------------------------------------
 Quét heap bitmap trên TENK1 (chi phí = 24,06..394.64 soi kèo bóng đá truoctran = 1007 chiều rộng = 244)
   RECHECK COND: (độc đáo1 <1000)
   - Quét chỉ mục bitmap trên TENK1_UNIQUE1 (chi phí = 0,00..23,80 soi kèo bóng đá truoctran = 1007 chiều rộng = 0)
         Index Cond: (độc đáo1 <1000)

Người lập kế hoạch kiểm traWHEREmệnh đề điều kiện 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ộtOprrestvà mục nhập trong trường hợp này làScalarltsel. TheScalarltselHàm lấy biểu đồ vìđộc đáo1từpg_statistic. Đối với các truy vấn thủ công, nó là nhiều hơn thuận tiện để xem xét đơn giản hơnpg_statsXem:

13069_13303

Tiếp theo tỷ lệ của biểu đồ bị chiếm bởi13384_13397đượ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ảtrong số những người trước. Giá trị 1000 rõ ràng trong thùng thứ hai (993-1997). Giả sử phân phối tuyến soi kèo bóng đá truoctran của các giá trị bên trong mỗi Xô, chúng ta có thể soi kèo bóng đá truoctran toán soi kèo bóng đá truoctran chọn lọc là:

chọn lọc = (1 + (1000 - xô [2] .min)/(xô [2] .max - xô [2] .min))/num_buckets
            = (1 + (1000 - 993)/(1997 - 993))/10
            = 0.100697

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

soi kèo bóng đá truoctran = rel_cardinality * chọn lọc
     = 10000 * 0.100697
     = 1007 (làm tròn)

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 = 'craaaa';

                        Kế hoạch truy vấn
----------------------------------------------------------------------
 SEQ SCAN trên TENK1 (chi phí = 0,00..483.00 soi kèo bóng đá truoctran = 30 chiều rộng = 244)
   Bộ lọc: (StringU1 = 'craaaa' :: name)

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. Để ước soi kèo bóng đá truoctran bình đẳng, biểu đồ là không hữu ích; Thay vào đó là danh sáchphổ biến nhất Giá trị(MCVs) được sử dụng để Xác định soi kèo bóng đá truoctran chọn lọc. Hãy xem MCVS, với Một số cột bổ sung 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 | 676
Hầu hết_common_vals | Ejaaaa, bbaaaa, craaaa, fcaaaa, feaaaa, gsaaaa, joaaaa, mcaaaa, naaaaa, wgaaaa

kể từcraaaaxuất hiện trong danh sách MCV, soi kèo bóng đá truoctran chọn lọc chỉ 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]
            = 0,003

Như trước đây, số lượng hàng ước soi kèo bóng đá truoctran chỉ là sản phẩm của cái này với soi kèo bóng đá truoctran chất củaTENK1:

soi kèo bóng đá truoctran = 10000 * 0,003
     = 30

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ế hoạch truy vấn
----------------------------------------------------------------------
 SEQ SCAN trên TENK1 (chi phí = 0,00..483.00 soi kèo bóng đá truoctran = 15 chiều rộng = 244)
   Bộ lọc: (StringU1 = 'xxx' :: name)

Đây là một vấn đề khá khác: Cách ước soi kèo bóng đá truoctran chọn lọc khi giá trị làkhôngTrongMCVDanh sách. Cách tiếp cận là sử soi kèo bóng đá truoctranng 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,003 + 0,003 + 0,003 + 0,003 + 0,003 +
                    0,003 + 0,003 + 0,003 + 0,003))/(676 - 10)
            = 0,0014559

nghĩa là thêm tất cả các tần số choMCV17385_17448khá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ị khác biệt khác. Lưu ý rằng không có giá trị null nên chúng tôi không phải lo lắng về những điều đó (nếu không chúng tôi đã Trừ phần null từ tử số là tốt). Các Số lượng hàng ước soi kèo bóng đá truoctran sau đó được soi kèo bóng đá truoctran như bình thường:

soi kèo bóng đá truoctran = 10000 * 0,0014559
     = 15 (làm tròn)

Ví dụ trsoi kèo bóng đá truoctran vớiĐộc đáo1 < 1000là một sự đơn giản hóa quá mức của những gìScalarltselThực sự; Bây giờ chúng ta đã thấy Một ví dụ về việc sử soi kèo bóng đá truoctranng MCV, chúng ta có thể điền vào một số chi tiết hơn. Ví dụ là chính xác theo như nó đã đi, bởi vì vìđộc đáo118319_18511Biểu đồ không bao gồm phần của dân số 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 soi kèo bóng đá truoctran chính xác hơn. TRONG Tình huống nàyScalarltseltrực tiếp áp soi kèo bóng đá truoctranng điều kiện (ví dụ:"< 1000 "18858_19294

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

                         Kế hoạch truy vấn
--------------------------------------------------------------------
 SEQ SCAN trên TENK1 (chi phí = 0,00..483.00 soi kèo bóng đá truoctran = 3077 chiều rộng = 244)
   Bộ lọc: (StringU1 <'IAAAAA' :: name)

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
Trong đó tablename = 'tenk1' và attname = 'StringU1';

                                Biểu đồ_bound
------------------------------------------------------------------------------------------------------
 Aaaaaa, cqaaaa, fraaaa, ibaaaa, kraaaa, nfaaaa, psaaaa, sgaaaa, vaaaaa, xlaaaa, zzaaaa

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 lần đầu tiên sáu mục và không phải là bốn mục cuối cùng, vì vậy sự chọn lọc trong MCV một phần dân số là

SELCTIVE = SUM (MVFS có liên quan)
            = 0,00333333 + 0,003 + 0,003 + 0,003 + 0,003 + 0,003
            = 0,01833333

Tóm lại tất cả các MCF cũng cho chúng ta biết rằng tổng số phần của Dân số được đại diện bởi MCV là 0,03033333, và do đó Phân số được biểu thị bằng biểu đồ là 0,96966667 (một lần nữa, Không có null, nếu không chúng ta phải loại trừ chúng ở đây). Chúng tôi có thể thấy rằng giá trịIAAAAAThác gần như Vào cuối nhóm biểu đồ thứ ba. Sử dụng một số đúng hơn Các giả định cheesy về tần suất của các ký tự khác nhau, Người lập kế hoạch đến ước soi kèo bóng đá truoctran 0,298387 cho phần của Dân số biểu đồ ít hơnIAAAAA. Sau đó chúng tôi kết hợp các ước soi kèo bóng đá truoctran cho MCV và dân số không phải MCV:

Chọn lọc = mcv_selectivity + Biểu đồ_selectivity * Biểu đồ
            = 0,01833333 + 0.298387 * 0.96966667
            = 0,307669

soi kèo bóng đá truoctran = 10000 * 0.307669
            = 3077 (làm tròn tắt)

21382_21863

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 trongWHEREmệnh đề:

22009_22477

Người lập kế hoạch giả định rằng hai điều kiện là độc lập, để các soi kèo bóng đá truoctran chọn riêng lẻ của các điều khoản có thể được nhân với nhau:

chọn lọc = chọn lọc (độc đáo1 <1000) * chọn lọc (StringU1 = 'xxx')
            = 0,100697 * 0,0014559
            = 0,0001466

soi kèo bóng đá truoctran = 10000 * 0.0001466
            = 1 (làm tròn tắt)

Lưu ý rằng số lượng hàng được ước soi kèo bóng đá truoctran sẽ được trả về từ Quét chỉ số bitmap chỉ phản ánh điều kiện được sử dụng với chỉ mục; Điều này rất quan trọng vì nó ảnh hưởng đến ước soi kèo bóng đá truoctran chi phí cho HEAP tiếp theo tìm nạp.

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
Trong đó t1.Unique1 <50 và t1.Unique2 = t2.unique2;

                                      Kế hoạch truy vấn
--------------------------------------------------------------------------------------------------
 Vòng lặp lồng nhau (chi phí = 4,64..456,23 soi kèo bóng đá truoctran = 50 chiều rộng = 488)
   - Quét heap bitmap trên tenk1 t1 (chi phí = 4,64..142,17 soi kèo bóng đá truoctran = 50 chiều rộng = 244)
         RECHECK COND: (Độc đáo1 <50)
         - Quét chỉ số bitmap trên TENK1_UNIQUE1 (chi phí = 0,00..4,63 soi kèo bóng đá truoctran = 50 chiều rộng = 0)
               Index Cond: (độc đáo1 <50)
   - Quét chỉ mục bằng TENK2_UNIQUE2 trên TENK2 T2 (chi phí = 0,00..6.27 soi kèo bóng đá truoctran = 1 chiều rộng = 244)
         INDEX cond: (t2.unique2 = t1.unique2)

Hạn chế đối vớiTENK1, độc đáo1 <5023984_24153độc đáo1Biểu đồ:

24233_24451

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, chức năng chọn lọc có được từOprjoinCột củapg_operatorvà làeqjoinsel. eqjoinselXem lên thông tin thống kê cho cả haitenk224932_24939TENK1:

25009_25332

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 tôi sử soi kèo bóng đá truoctranng một thuật toán chỉ dựa vào số lượng giá trị khác biệt cho cả hai mối quan hệ cùng với null của họ Phân số:

25678_25844

25855_26156

soi kèo bóng đá truoctran = (outer_cardinality * inter_cardinality) * chọn lọc
     = (50 * 10000) * 0,0001
     = 50

Đã có danh sách MCV cho hai cột,eqjoinselĐã sử dụng so sánh trực tiếp Danh sách MCV để xác định soi kèo bóng đá truoctran chọn lọc tham gia trong phần của các quần thể cột được đại diện bởi MCV. Ước soi kèo bóng đá truoctran phần còn lại của quần thể theo cách tiếp cận tương tự hiển thị ở đây.

Lưu ý rằng chúng tôi đã hiển thịInside_cardinalitynhư 10000, nghĩa là Kích thsoi kèo bóng đá truoctran không biến đổi củatenk2. Nó có thể xuất hiện từ việc kiểm traGiải thíchđầu ra ước soi kèo bóng đá truoctran các hàng nối đến từ 50 * 1, nghĩa là, nghĩa là, Số lượng hàng bên ngoài nhân cách số lượng hàng ước soi kèo bóng đá truoctran thu được từ mỗi lần quét chỉ mục bên trong trênTENK2. Nhưng đây không phải là trường hợp: sự tham gia Kích thước quan hệ được ước soi kèo bóng đá truoctran trước khi bất kỳ kế hoạch tham gia cụ thể nào có đã được xem xét. Nếu mọi thứ đang hoạt động tốt thì hai cách ước soi kèo bóng đá truoctran kích thước tham gia sẽ tạo ra cùng một câu trả lời, Nhưng do lỗi vòng tròn và các yếu tố khác đôi khi chúng phân kỳ đáng kể.

Đối với những người quan tâm đến chi tiết hơn, ước soi kèo bóng đá truoctran của Kích thước của một bảng (trước bất kỳWHEREmệnh đề) được thực hiện trong. Chung chung logic cho điều khoản chọn lọc là trongsrc/phụ trợ/tối ưu hóa/path/clausesel.c. Các Các chức năng chọn lọc cụ thể của người vận hành hầu hết được tìm thấy trong.