?
本文檔使用 php中文網(wǎng)手冊 發(fā)布
就像我們在上一節(jié)里展示的那樣,查詢規(guī)劃器需要估計一個查詢檢索的行數(shù),這樣才能選擇正確的查詢規(guī)劃。 本節(jié)就系統(tǒng)用于這些估計的統(tǒng)計進行一些描述。
統(tǒng)計的一個部分就是每個表和索引中的記錄總數(shù),以及每個表和索引占據(jù)的磁盤塊數(shù)。 這個信息保存在 pg_class 表的 reltuples 和 relpages 字段中。 我們可以用類似下面的查詢檢索這些信息:
SELECT relname,relkind,reltuples,relpages FROM pg_class WHERE 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不是實時更新的 ,因此它們通常包含可能有些過時的數(shù)值。 它們被VACUUM,ANALYZE和幾個DDL命令(比如CREATE INDEX)更新。 一個獨立的 ANALYZE(沒有和VACUUM 在一起)生成一個reltuples的近似數(shù)值, 因為它并沒有讀取表里的每一行。 規(guī)劃器將把pg_class表里面的數(shù)值調(diào)整為和當前的物理表尺寸匹配, 以此獲取一個更接近的近似值。
大多數(shù)查詢只是檢索表中行的一部分,因為它們有限制待查行的WHERE子句。 因此規(guī)劃器需要對WHERE子句的選擇性進行評估,選擇性也就是符合WHERE子句中每個條件的部分。 用于這個目的的信息存儲在pg_statistic系統(tǒng)表中。 在pg_statistic中的記錄是由ANALYZE和VACUUMANALYZE命令更新的, 并且總是近似值,即使剛剛更新完也不例外。
除了直接查看pg_statistic 之外, 我們手工檢查統(tǒng)計的時候最好查看它更具可讀性的pg_stats視圖。 而且,pg_statistic 是所有人都可以讀取的,而 pg_statistic 只能由超級用戶讀取。 這樣就可以避免非特權用戶從統(tǒng)計信息中獲取一些和其他人的表內(nèi)容相關的信息。 pg_statistic 視圖是受約束的,只顯示當前用戶可讀的表。 比如,我們可以:
SELECT attname,inherited,n_distinct, array_to_string(most_common_vals,E'\n') as most_common_vals FROM pg_stats WHERE tablename = 'road'; attname | inherited | n_distinct | most_common_vals ---------+-----------+------------+------------------------------------ name | f | -0.363388 | I- 580 Ramp+ | | | I- 880 Ramp+ | | | Sp Railroad + | | | I- 580 + | | | I- 680 Ramp name | t | -0.284859 | I- 880 Ramp+ | | | I- 580 Ramp+ | | | I- 680 Ramp+ | | | I- 580 + | | | State Hwy 13 Ramp (2 rows)
注意,這兩行用的是相同的列,一個對應開始于road表的完整繼承層次結構(inherited=t), 另一個只包括road表本身(inherited=f)。
在pg_statistic中存儲的信息的數(shù)量, 特別是給每個字段用的most_common_vals和histogram_bounds數(shù)組上的 最大記錄數(shù)目可以用ALTER TABLE SET STATISTICS命令設置, 或者是用運行時參數(shù)default_statistics_target 進行全局設置。 目前缺省的限制是 10 個記錄。 提升該限制應該可以做出更準確的規(guī)劃器估計,特別是對那些有不規(guī)則數(shù)據(jù)分布的字段而言, 代價是在pg_statistic里使用了更多空間,并且需要略微多一些的時間計算估計數(shù)值。 相比之下,比較低的限制可能更適合那些數(shù)據(jù)分布比較簡單的字段。
更多規(guī)劃器在統(tǒng)計方面的使用可參閱Chapter 56。