ANALYZE

Name

ANALYZE -- 蒐集與資料庫有關的統計

Synopsis

ANALYZE [ VERBOSE ] [ table [ (column [, ...] ) ] ]

描述

ANALYZE 蒐集有關 PostgreSQL 資料表的內容的統計,然後把結果保存在系統資料表 pg_statistic 裡。隨後,查詢規劃器就可以使用這些統計幫助判斷查詢的最有效的規劃。

如果沒有參數,ANALYZE 檢查在目前資料庫裡的所有資料表。 如果有參數,ANALYZE 只檢查那個資料表。 您還可以給出一列字串名字,這個時候只蒐集那些字串的統計訊息。

輸入

VERBOSE

打開處理過程訊息的顯示。

table

要分析的特定資料表(可能用模式名修飾)的名字。預設是目前資料庫裡所有資料表。

column

要分析的特定字串的名字。預設是所有字串。

輸出

如果聲明了 VERBOSEANALYZE 發出進度訊息,資料表明目前正在處理的是哪行。 同時打印有關改資料表的很多其它訊息。

注意

週期性地執行 ANALYZE,或者在對資料表的大部分內容做了更改之後馬上執行它是個好習慣, 準確的統計訊息將幫助規劃器選擇最合適的查詢規劃,並因此而改善查詢處理的速度。 一種比較經常採用的策略是每天在低負荷的時候執行一次 VACUUMANALYZE

VACUUM FULL 不同的是, ANALYZE 只需要在目標資料表上有一個讀取鎖, 因此它可以和資料表上的其它活動並行地執行。

蒐集的統計訊息通常包括一個每字串最常用數值的列資料表以及一個包線圖,顯示每個字串裡資料的近似分佈。 如果 ANALYZE 認為它們都沒有什麼用, (比如,在一個唯一鍵字的字串上沒有公共的數值)或者是該字串資料類型不支援相關的操作符, 那麼它們都可以忽略。在 Chapter 21 中有關於統計的更多訊息。

對於大資料表,ANALYZE 採集資料表內容的一個隨機的抽樣做統計,而不是檢查每一行。 這樣就保證了即使是在很大的資料表上,我們也只需要很少的一些時間就可以完成分析。 不過,要注意的是統計只是近似的結果,而且每次執行ANALYZE都會導致 EXPLAIN 顯示的規劃器的預期開銷有一些小變化, 即使資料表內容實際上沒有改變也這樣。在很小的概率的情況下,這個不確定的行為會導致查詢優化器在不同 ANALYZE 之間選擇不同的查詢規劃。為了避免這個問題,可以提高 ANALYZE 蒐集的統計數量,像下面描述的那樣。

分析的廣度可以透過用調整 default_statistics_target 參變量, 或者是以每字串為基礎透過用 ALTER TABLE ... ALTER COLUMN ... SET STATISTICS (參閱 ALTER TABLE) 設置每字串的統計目標來控制。目標數值設置最常用數值列資料表中的記錄的最大數目以及包線圖中的最大塊數。 預設的目標數值是 10,不過我們可以調節這個數值獲取規劃器計算精度和 ANALYZE 執行所需要的時間以及 pg_statistic 裡面佔據的空間數目之間的平衡。 特別是,把統計目標設置為零就關閉了該字串的統計蒐集。 這麼做對那些從來不參與到查詢的 WHEREGROUP BY,或者 ORDER BY 子句裡的字串是很有用的,因為規劃器不會使用到這樣的字串上的統計。

在被分析的字串中最大的統計目標決定為統計採樣的資料表中的行的數目。 增大目標會導致做 ANALYZE 的時候成比例地增大對時間和空間的需求。

相容性

SQL92 裡沒有 ANALYZE 語句。