ANALYZE(7) SQL Commands ANALYZE(7)

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

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

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


如果沒有引數,ANALYZE 檢查在當前資料庫裡的所有表。 如果有引數,ANALYZE 只檢查那個表。 你還可以給出一列欄位名字,這個時候只收集那些欄位的統計資訊。


開啟處理過程資訊的顯示。

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

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


如果聲明瞭 VERBOSE,ANALYZE 發出進度資訊,表明當前正在處理的是哪行。 同時列印有關改表的很多其它資訊。


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


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


收集的統計資訊通常包括一個每欄位最常用數值的列表以及一個包線圖,顯示每個欄位裡資料的近似分佈。 如果 ANALYZE 認為它們都沒有什麼用, (比如,在一個唯一鍵字的欄位上沒有公共的數值)或者是該欄位資料型別不支援相關的運算子, 那麼它們都可以忽略。在 Chapter 21 ``Routine Database Maintenance'' 中有關於統計的更多資訊。


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


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


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

SQL 標準裡沒有 ANALYZE 語句。

譯者

Postgresql 中文網站 何偉平 <laser@pgsqldb.org>

本頁面中文版由中文 man 手冊頁計劃提供。
中文 man 手冊頁計劃:https://github.com/man-pages-zh/manpages-zh

2003-11-02 SQL - Language Statements