PostgresSQL-規劃器使用的統計信息

13.2. 規劃器使用的統計信息

就象咱們在上一節裏展現的那樣,查詢規劃器須要估計一個查詢檢索的行的數目,這樣才能選擇正確的查詢規劃。 本節就係統用於這些估計的統計進行一些描述。php

統計的一個部分就是每一個表和索引中的記錄總數,以及每一個表和索引佔據的磁盤塊數。 這個信息保存在 pg_class 的 reltuples 和 relpages 字段中。咱們能夠用相似下面的查詢檢索這些信息:html

 relname LIKE 'tenk1%';

       relname        | relkind | reltuples | relpages
----------------------+---------+-----------+----------
 tenk1                | r       |     10000 |      358
 tenk1_hundred        | i       |     10000 |       30
 tenk1_thous_tenthous | i       |     10000 |       30
 tenk1_unique1        | i       |     10000 |       30
 tenk1_unique2        | i       |     10000 |       30
(5 rows)

咱們在這裏能夠看到 tenk1 有 10000 行, 它的索引也有這麼多行,可是索引遠比表小得多(很正常)。數組

出於效率考慮,reltuples 和 relpages 不是實時更新的, 所以它們一般包含可能有些過期的數值。 它們被 VACUUMANALYZE,和幾個 DDL 命令,好比 CREATE INDEX 更新。一個獨立的 ANALYZE, 也就是沒有和 VACUUM 在一塊兒的, 生成一個reltuples 的近似數值, 由於它並無讀取表裏的每一行。規劃器將把 pg_class 表裏面的數值調整爲和當前的物理表尺寸匹配,以此獲取一個更接近的近似值。spa

大多數查詢只是檢索表中行的一部分,由於它們有限制待查行的 WHERE 子句。 所以規劃器須要對WHERE子句的選擇性(selectivity)進行評估, 選擇性也就是符合WHERE子句中每一個條件的部分。 用於這個目的的信息存儲在 pg_statistic 系統表中。 在 pg_statistic 中的記錄是由 ANALYZE 和 VACUUM ANALYZE 命令更新的, 而且老是近似值,即便剛剛更新完也不例外設計

除了直接查看 pg_statistic 以外, 咱們手工檢查統計的時候最好查看它的視圖 pg_stats。 pg_stats 設計成更具可讀性。 並且,pg_stats 是全部人均可以讀取的, 而 pg_statistic只能由超級用戶讀取。 (這樣就能夠避免非特權用戶從統計信息中獲取一些和其餘人的表內容相關的信息。 pg_stats 視圖是受約束的,只顯示當前用戶可讀的表。) 好比,咱們能夠∶code

SELECT attname, n_distinct, most_common_vals FROM pg_stats WHERE tablename = 'road';

 attname | n_distinct |                                                                                                                                                                                 most_common_vals                                                                                                                               

---------+------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 name    |  -0.467008 | {"I- 580                        Ramp","I- 880                        Ramp","Sp Railroad                       ","I- 580                            ","I- 680                        Ramp","I- 80                         Ramp","14th                          St  ","5th                           St  ","Mission                       Blvd","I- 880                            "}
 thepath |         20 | {"[(-122.089,37.71),(-122.0886,37.711)]"}
(2 rows)

pg_stats 在 Section 42.43 裏詳細描述。orm

在 pg_statistic 李存儲的信息的數量,特別是 給每一個字段用的 most_common_vals 和 histogram_bounds 數組上的最大記錄數目能夠用 ALTER TABLE SET STATISTICS 命令設置, 或者是用運行時參數 default_statistics_target 進行全局設置。 目前缺省的限制是 10 個記錄。 提高該限制應該能夠作出更準確的規劃器估計,特別是對那些有不規則數據分佈的字段而言, 付出的代價是在 pg_statistic 裏使用了更多空間,而且須要略微多一些的時間計算估計數值。 相比之下,比較低的限制可能更適合那些數據分佈比較簡單的字段htm

相關文章
相關標籤/搜索