?
このドキュメントでは、 php中國語ネットマニュアル リリース
ANALYZE [ VERBOSE ] [ table [ ( column [, ...] ) ] ]
ANALYZE收集表內(nèi)容的統(tǒng)計信息,然后把結(jié)果保存在系統(tǒng)表pg_statistic里。 隨后,查詢規(guī)劃器就可以使用這些統(tǒng)計幫助判斷查詢的最佳規(guī)劃。
如果沒有參數(shù),ANALYZE檢查當(dāng)前數(shù)據(jù)庫里的所有表。 如果有參數(shù),ANALYZE只檢查那個表。 你還可以給出一列字段名字,這個時候只收集那些字段的統(tǒng)計信息
顯示處理過程的信息
要分析的特定表(可能用模式名修飾)的名字。缺省是當(dāng)前數(shù)據(jù)庫里所有表。
要分析的特定字段的名字。缺省是所有字段。
如果聲明了VERBOSE,那么ANALYZE將發(fā)出進(jìn)度信息, 表明當(dāng)前正在處理的是哪行。同時打印有關(guān)改表的很多其它信息。
在默認(rèn)的PostgreSQL配置中,autovacuum守護(hù)進(jìn)程 (參閱Section 23.1.5)負(fù)責(zé)在初次加載數(shù)據(jù)時自動分析表。 因為它們會改變整個常規(guī)操作。當(dāng)autovacuum關(guān)閉時, 周期性地運(yùn)行ANALYZE,或者在對表的大部分內(nèi)容做了更改之后 馬上運(yùn)行它是個好習(xí)慣, 準(zhǔn)確的統(tǒng)計信息將幫助規(guī)劃器選擇最合適的查詢規(guī)劃,并因此改善查詢處理的速度。 一種比較經(jīng)常采用的策略是每天在低負(fù)荷的時候運(yùn)行一次VACUUM 和ANALYZE 。
ANALYZE只需要在目標(biāo)表上有一個讀取鎖,因此它可以和表上的其它活動并發(fā)地運(yùn)行。
ANALYZE收集的統(tǒng)計信息通常包括每個字段最常用數(shù)值的列表以及顯示每個字段里數(shù)據(jù)近似分布的包線圖。 如果ANALYZE認(rèn)為它們都沒有什么用(比如在一個擁有唯一約束的字段上沒有公共的數(shù)值)或者是該字段數(shù)據(jù)類型不支持相關(guān)的操作符, 那么它們都可以忽略。在Chapter 23中有關(guān)于統(tǒng)計的更多信息。
對于大表,ANALYZE采集表內(nèi)容的一個隨機(jī)抽樣做統(tǒng)計, 而不是檢查每一行。這樣就保證了即使是在很大的表上也只需要很少時間就可以完成分析。 不過,要注意的是統(tǒng)計只是近似的結(jié)果, 而且每次運(yùn)行ANALYZE都會導(dǎo)致EXPLAIN顯示 的規(guī)劃器的預(yù)期開銷有一些小變化,即使表內(nèi)容實際上沒有改變也這樣。 在極少的情況下,此非決定論會引發(fā)規(guī)劃器在ANALYZE運(yùn)行后引發(fā)查詢 計劃更改。為了避免這個問題,可以提高ANALYZE收集的統(tǒng)計數(shù)量, 像下面描述的那樣。
分析的廣度可以通過用調(diào)整default_statistics_target配置變量, 或者是以每字段為基礎(chǔ)通過用ALTER TABLE ... ALTER COLUMN ... SET STATISTICS(參閱ALTER TABLE)設(shè)置每字段的統(tǒng)計目標(biāo)來控制。 目標(biāo)數(shù)值設(shè)置最常用數(shù)值列表中的記錄的最大數(shù)目以及包線圖中的最大塊數(shù)。 缺省的目標(biāo)數(shù)值是100,不過可以調(diào)節(jié)這個數(shù)值獲取規(guī)劃器計算精度和 ANALYZE運(yùn)行所需要的時間以及pg_statistic里面占據(jù)的空間數(shù)目之間的平衡。 特別是,把統(tǒng)計目標(biāo)設(shè)置為零就關(guān)閉了該字段的統(tǒng)計收集。 這么做對那些從來不參與到查詢的WHERE,GROUP BY, 或者ORDER BY子句里的字段是很有用的,因為規(guī)劃器不會使用到這樣的字段上的統(tǒng)計。
在被分析的字段中最大的統(tǒng)計目標(biāo)決定統(tǒng)計采樣的行數(shù)。 增大目標(biāo)會導(dǎo)致ANALYZE的時候成比例地增大對時間和空間的需求。
One of the values estimated by ANALYZE is the number of distinct values that appear in each column. Because only a subset of the rows are examined, this estimate can sometimes be quite inaccurate, even with the largest possible statistics target. If this inaccuracy leads to bad query plans, a more accurate value can be determined manually and then installed with ALTER TABLE ... ALTER COLUMN ... SET (n_distinct = ...) (see ALTER TABLE). ANALYZE的一個估計值是出現(xiàn)在每列的不同值的數(shù)目。因為僅僅 行的一個子集被檢查,這個估計值有時會很不準(zhǔn)確,甚至是對最大可能的統(tǒng)計目標(biāo)。 如果這個錯誤導(dǎo)致了差的查詢計劃,一個更精確的值可以通過手動確定并且然后通過 ALTER TABLE ... ALTER COLUMN ... SET (n_distinct = ...)安裝。 (參閱 ALTER TABLE)。
If the table being analyzed has one or more children, ANALYZE will gather statistics twice: once on the rows of the parent table only, and a second time on the rows of the parent table with all of its children. The autovacuum daemon, however, will only consider inserts or updates on the parent table when deciding whether to trigger an automatic analyze. If that table is rarely inserted into or updated, the inheritance statistics will not be up to date unless you run ANALYZE manually. 若已分析的表有一個或者更多子表,ANALYZE將會收集統(tǒng)計兩次: 一次僅僅在父表的行上,第二次是在父表及其所有子表的行上。autovacuum守護(hù)進(jìn)程, 然而,會僅僅考慮在父表上進(jìn)行插入或者更新,在決定是否觸發(fā)一個自動分析時。 若果那個表幾乎不插入或者更新,繼承的統(tǒng)計數(shù)據(jù)將不再更新,除非您手動運(yùn)行 ANALYZE。
SQL標(biāo)準(zhǔn)里沒有ANALYZE語句。