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

68.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ũ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 tạo ra số liệu thống kê, kết quả sẽ thay đổi một chút sau bất kỳ mớiPhâ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 để hoàn thiện. Số lượng trang và soi kèo bóng đá truoctran được tra cứu trongpg_ class:

11113_11250

Những con số này là hiện tại của lần cuốiVACUUMhoặcPhân tíchtrê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). Nếu điều đó khác vớirelpagessau đóReltuplesđược chia tỷ lệ tương ứng để đạt được ước soi kèo bóng đá truoctran số hàng hiện tại. Trong ví dụ trên, giá trị củaRelpagesđược cập nhật để ướ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 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ộtOprrestvà mục nhập trong trường hợp này làScalarltsel. TheScalarltselHàm lấy biểu đồ chođộc đáo1từpg_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_statsXem:

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

                   Biểu đồ_bound
------------------------------------------------------------------
 0,993,1997,3050,4040,5036.5957,7057,8029,9016,9995

Tiếp theo tỷ lệ của biểu đồ bị chiếm bởi<1000Hồiđược thực hiện. Đây là soi kèo bóng đá truoctran chọn lọc. Biểu đồ chia phạm vi thành các thùng tần số bằng nhau, 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 mà giá trị của chúng ta ở và đếmPhầncủa nó vàtất cảtrong số những cái trước. Giá trị 1000 rõ ràng trong thùng thứ hai (993 Từ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 nhóm, chúng ta có thể soi kèo bóng đá truoctran toán độ 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 phần thứ hai, chia cho số lượng thùng. Số lượng hàng ước soi kèo bóng đá truoctran 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à soi kèo bóng đá truoctran toán 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 trongWHEREmệ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. Đối với ước soi kèo bóng đá truoctran bình đẳng, biểu đồ không hữu ích; Thay vào đó là danh sáchGiá trị phổ biến nhất(MCVS) được sử dụng để xác định soi kèo bóng đá truoctran chọn lọc. Chúng ta hãy xem các MCV, 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 điều 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 có 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ế 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ácMCVs:

chọn lọc = (1 - sum (mcv_freqs))/(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ố 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. 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 giá trị đó (nếu không chúng tôi sẽ trừ phần null từ tử số). 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 đáo1là 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 soi kèo bóng đá truoctran chính xác hơn. Trong tình huống nàyScalarltselÁp soi kèo bóng đá truoctranng trực tiếp điều kiện (ví dụ:Hồi<1000) 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 soi kèo bóng đá truoctran chính xác về soi kèo bóng đá truoctran chọn lọc trong phần của bảng là MCV. Biểu đồ sau đó được sử dụng theo cách tương tự như trên để ước soi kèo bóng đá truoctran độ chọn lọc trong phần của bảng không phải là MCV và sau đó hai số được kết hợp để ước soi kèo bóng đá truoctran độ chọn lọc tổng thể. Ví dụ, xem xét

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 sáu mục đầu tiên và không phải là bốn mục cuối cùng, vì vậy soi kèo bóng đá truoctran chọn lọc trong phần MCV của dân số là

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

Tóm tắt tất cả các MCF cũng cho chúng ta biết rằng tổng số dân số được đại diện bởi MCV là 0,03033333, và do đó, phần được biểu thị bằng biểu đồ là 0.9696667 (một lần nữa, không có null nào, chúng ta sẽ loại bỏ chúng ở đây). Chúng ta có thể thấy rằng giá trịIAAAAArơ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 soi kèo bóng đá truoctran 0,298387 cho phần quần thể biểu đồ nhỏ hơnIAAAAA. Sau đó, chúng tôi kết hợp các ước soi kèo bóng đá truoctran cho quần thể MCV và 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)

Trong ví dụ cụ thể này, hiệu chỉnh từ danh sách MCV khá nhỏ, vì phân phối cột thực sự khá phẳng (số liệu thống kê cho thấy các giá trị cụ thể này là phổ biến hơn so với các giá trị khác chủ yếu là do lỗi lấy mẫu). Trong một trường hợp điển hình hơn trong đó một số giá trị phổ biến hơn đáng kể so với các giá trị khác, quá trình phức tạp này mang lại sự cải thiện hữu ích về độ chính xác vì soi kèo bóng đá truoctran chọn lọc cho các giá trị phổ biến nhất được tìm thấy chính xác.

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 đề:

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

                                   Kế hoạch truy vấn
----------------------------------------------------------------------- -------------
 Quét heap bitmap trên TENK1 (chi phí = 23,80..396.91 soi kèo bóng đá truoctran = 1 chiều rộng = 244)
   RECHECK COND: (độc đáo1 <1000)
   Bộ lọc: (StringU1 = 'xxx' :: name)
   - 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 giả định rằng hai điều kiện độ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 <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 các đống tiếp theo.

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: (độc đáo2 = t1.unique2)

Hạn chế đối vớiTENK1, độc đáo1 <50, được đánh giá trsoi kèo bóng đá truoctran khi nối vòng lồng. Điều này được xử lý tương tự với ví dụ phạm vi trsoi kèo bóng đá truoctran đó. Lần này giá trị 50 rơi vào thùng đầu tiên củađộc đáo1Biểu đồ:

chọn lọc = (0 + (50 - xô [1] .min)/(xô [1] .max - xô [1] .min))/num_buckets
            = (0 + (50 - 0)/(993 - 0))/10
            = 0,005035

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

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ừOprjoinCột củapg_operator, và làeqjoinsel. eqjoinseltìm kiếm thông tin thống kê cho cả haitenk2tenk1:

24969_25292

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

25686_25840

Đây là, trừ phần null từ một cho mỗi mối quan hệ và chia cho số lượng hàng của mối quan hệ lớn hơn (giá trị này được chia tỷ lệ trong trường hợp không duy nhất). Số lượng hàng mà sự tham gia có khả năng phát ra được soi kèo bóng đá truoctran bằng soi kèo bóng đá truoctran toán của sản phẩm Cartesian của hai đầu vào, nhân với độ chọn lọc:

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 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 soi kèo bóng đá truoctran 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.

Lưu ý rằng chúng tôi đã hiển thịInside_cardinalityAS 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ích26892_27058Tenk2. Nhưng đây không phải là trường hợp: Kích thước quan hệ tham gia được ước soi kèo bóng đá truoctran trước khi bất kỳ kế hoạch tham gia cụ thể nào đượ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 sai số vòng 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 thêm, ước soi kèo bóng đá truoctran kích thước của một bảng (trước bất kỳWHEREmệ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 trong27830_27864.

Gửi hiệu chỉnh

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 phù hợp Kinh nghiệm của bạn với soi kèo bóng đá truoctran 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.