ANALYZE
— 收集資料庫內容統計資訊
ANALYZE [ (option
[, ...] ) ] [table_and_columns
[, ...] ] whereoption
can be one of: VERBOSE [boolean
] SKIP_LOCKED [boolean
] BUFFER_USAGE_LIMITsize
andtable_and_columns
is: [ ONLY ]table_name
[ * ] [ (column_name
[, ...] ) ]
ANALYZE
收集關於資料庫中表內容的統計資訊,並將結果儲存在 pg_statistic
系統目錄中。之後,查詢規劃器會利用這些統計資訊來幫助確定查詢的最有效執行計劃。
如果省略 table_and_columns
列表,ANALYZE
會處理當前資料庫中當前使用者有權分析的每個表和物化檢視。如果提供了列表,ANALYZE
只會處理列表中的表。還可以提供列名列表,在這種情況下,只會收集這些列的統計資訊。
VERBOSE
啟用在 INFO
級別顯示進度訊息。
SKIP_LOCKED
指定 ANALYZE
在開始處理關係時,不等待任何衝突鎖被釋放:如果無法立即鎖定關係而無需等待,則跳過該關係。請注意,即使使用此選項,ANALYZE
在開啟關係的索引、從分割槽、表繼承的子表以及某些型別的外部表中獲取樣本行時,仍可能被阻塞。此外,雖然 ANALYZE
通常會處理指定分割槽表的全部分割槽,但如果分割槽表上存在衝突鎖,此選項會導致 ANALYZE
跳過所有分割槽。
BUFFER_USAGE_LIMIT
為 ANALYZE
指定 緩衝訪問策略 環形緩衝器的大小。此大小用於計算將作為此策略一部分重用的共享緩衝區的數量。0
停用 Buffer Access Strategy
的使用。未指定此選項時,ANALYZE
使用 vacuum_buffer_usage_limit 的值。較高的設定可以使 ANALYZE
執行得更快,但設定過大可能會導致過多其他有用頁面被從共享緩衝區中驅逐。最小值是 128 kB
,最大值是 16 GB
。
boolean
指定是否應開啟或關閉選定的選項。您可以編寫 TRUE
、ON
或 1
來啟用選項,編寫 FALSE
、OFF
或 0
來停用選項。boolean
值也可以省略,在這種情況下假定為 TRUE
。
size
指定記憶體量(以千位元組為單位)。大小也可以指定為包含數值大小後跟以下任一記憶體單位的字串:B
(位元組)、kB
(千位元組)、MB
(兆位元組)、GB
(吉位元組) 或 TB
(太位元組)。
table_name
要分析的特定表的名稱(可能已模式限定)。如果省略,則分析當前資料庫中的所有常規表、分割槽表和物化檢視(但不包括外部表)。如果 ONLY
指定在表名前,則只分析該表。如果未指定 ONLY
,則分析該表及其所有繼承的子表或分割槽(如果有)。可以選擇在表名後指定 *
以明確表示要分析繼承的子表(或分割槽)。
column_name
要分析的特定列的名稱。預設為所有列。
當指定 VERBOSE
時,ANALYZE
會發出進度訊息,指示當前正在處理哪個表。還會列印關於表的各種統計資訊。
要分析一個表,通常必須擁有該表的 MAINTAIN
許可權。但是,資料庫所有者可以分析其資料庫中的所有表,但共享目錄除外。ANALYZE
會跳過呼叫使用者無權分析的任何表。
外部表僅在明確選擇時才會被分析。並非所有外部資料包裝器都支援 ANALYZE
。如果表的包裝器不支援 ANALYZE
,該命令會列印警告並什麼都不做。
在預設的 PostgreSQL 配置中,自動清理守護程序(請參閱 第 24.1.6 節)負責在表首次載入資料時以及在正常操作過程中發生變化時自動分析表。當停用自動清理時,最好定期執行 ANALYZE
,或在對錶內容進行重大更改後執行。ANALYZE
準確的統計資訊將有助於規劃器選擇最合適的查詢計劃,從而提高查詢處理的速度。對於讀多寫少的資料庫,一種常見的策略是在每天的低使用時段執行一次 VACUUM
和 ANALYZE
。(如果更新活動頻繁,這可能不夠。)
當 ANALYZE
執行時,search_path 會被臨時更改為 pg_catalog, pg_temp
。
ANALYZE
只需對目標表進行讀鎖定,因此它可以與表上的其他非 DDL 活動並行執行。
ANALYZE
收集的統計資訊通常包括每列中最常見值的列表以及顯示每列資料近似分佈的直方圖。如果 ANALYZE
認為它們不重要(例如,在唯一鍵列中,沒有常見值),或者列資料型別不支援相應的運算子,則可以省略其中一個或兩個。關於統計資訊的更多資訊,請參閱 第 24 章。
對於大型表,ANALYZE
會對錶內容進行隨機抽樣,而不是檢查每一行。這使得即使是非常大的表也能在短時間內被分析。但請注意,統計資訊只是近似的,並且每次執行 ANALYZE
時都會略有變化,即使實際表內容未更改。這可能導致由 EXPLAIN
顯示的規劃器估算成本發生微小變化。在極少數情況下,這種非確定性會導致規劃器選擇的查詢計劃在執行 ANALYZE
後發生更改。為避免這種情況,請提高 ANALYZE
收集的統計資訊量,如下所述。
分析的範圍可以透過調整 default_statistics_target 配置變數來控制,或者透過使用 ALTER TABLE ... ALTER COLUMN ... SET STATISTICS
設定每個列的統計資訊目標來按列進行控制。目標值設定了最常見值列表中的最大條目數和直方圖中的最大 bin 數。預設目標值為 100,但可以根據需要調整該值,以權衡規劃器估算的準確性與 ANALYZE
所需的時間以及 pg_statistic
中的空間佔用量。特別地,將統計資訊目標設定為零會停用該列的統計資訊收集。對於從不在查詢的 WHERE
、GROUP BY
或 ORDER BY
子句中用作一部分的列,停用統計資訊可能很有用,因為規劃器不會使用這些列的統計資訊。
正在分析的列中最大的統計資訊目標決定了為準備統計資訊而抽樣的錶行數。增加目標值會導致 ANALYZE
所需的時間和空間成比例增加。
ANALYZE
估算的值之一是每列中不同值的數量。由於只檢查了行的一部分,這個估計有時可能相當不準確,即使使用了最大的統計資訊目標。如果這種不準確性導致不良的查詢計劃,則可以手動確定一個更準確的值,然後使用 ALTER TABLE ... ALTER COLUMN ... SET (n_distinct = ...)
進行安裝。
如果被分析的表有繼承子表,ANALYZE
會收集兩組統計資訊:一組僅針對父表中的行,另一組包含父表及其所有子表中的行。當規劃處理整個繼承樹的查詢時,第二組統計資訊是必需的。然而,自動清理守護程序在決定是否觸發對父表的自動分析時,只會考慮對父表本身的插入或更新。如果該表很少被插入或更新,則繼承統計資訊將不會是最新的,除非您手動執行 ANALYZE
。預設情況下,ANALYZE
還會遞迴地收集和更新每個繼承子表的統計資訊。ONLY
關鍵字可用於停用此行為。
對於分割槽表,ANALYZE
透過對所有分割槽的行進行抽樣來收集統計資訊。預設情況下,ANALYZE
還會遞迴地收集和更新每個分割槽的統計資訊。ONLY
關鍵字可用於停用此行為。
自動清理守護程序不處理分割槽表,也不處理僅修改子表的繼承父表。通常需要定期手動執行 ANALYZE
來保持表層級結構的統計資訊最新。
如果任何子表或分割槽是其外部資料包裝器不支援 ANALYZE
的外部表,則在收集繼承統計資訊時會忽略這些表。
如果正在分析的表完全為空,ANALYZE
不會為該表記錄新的統計資訊。任何現有的統計資訊都將保留。
每個執行 ANALYZE
的後端都會在其 pg_stat_progress_analyze
檢視中報告其進度。有關詳細資訊,請參閱 第 27.4.1 節。
SQL 標準中沒有 ANALYZE
語句。
以下語法在 PostgreSQL 11 版本之前使用,並且仍然受支援
ANALYZE [ VERBOSE ] [ table_and_columns
[, ...] ]
如果您在文件中發現任何不正確、與您在使用特定功能時的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。