ANALYZE — 收集關於資料庫的統計資訊
ANALYZE [ (option
[, ...] ) ] [table_and_columns
[, ...] ] whereoption
can be one of: VERBOSE [boolean
] SKIP_LOCKED [boolean
] BUFFER_USAGE_LIMITsize
andtable_and_columns
is:table_name
[ (column_name
[, ...] ) ]
ANALYZE
收集關於資料庫中表格內容的統計資訊,並將結果儲存在 pg_statistic
系統目錄中。隨後,查詢規劃器使用這些統計資訊來協助確定查詢最有效的執行計畫。
如果沒有 table_and_columns
列表,ANALYZE
會處理目前資料庫中目前使用者具有分析權限的每個表格和實體化檢視表。 如果有列表,ANALYZE
只會處理這些表格。 也可以為表格提供欄位名稱列表,在這種情況下,只會收集這些欄位的統計資訊。
VERBOSE
啟用顯示進度訊息。
SKIP_LOCKED
指定 ANALYZE
在開始處理關聯時,不應等待任何衝突的鎖定被釋放:如果無法立即鎖定關聯而不必等待,則會跳過該關聯。 請注意,即使使用此選項,ANALYZE
在開啟關聯的索引,或從分割區、表格繼承子項目和某些類型外部表格取得樣本列時,仍然可能會被封鎖。 此外,雖然 ANALYZE
通常會處理指定分割表格的所有分割區,但如果分割表格上有衝突的鎖定,此選項會導致 ANALYZE
跳過所有分割區。
BUFFER_USAGE_LIMIT
指定 ANALYZE
的緩衝區存取策略環形緩衝區大小。 此大小用於計算將作為此策略的一部分重新使用的共享緩衝區數量。 0
停用 緩衝區存取策略
的使用。 如果未指定此選項,ANALYZE
會使用來自 vacuum_buffer_usage_limit 的值。 較高的設定可以讓 ANALYZE
執行得更快,但設定太大的值可能會導致太多其他有用的頁面從共享緩衝區中清除。 最小值為 128 kB
,最大值為 16 GB
。
boolean
指定是否應開啟或關閉選定的選項。 您可以寫入 TRUE
、ON
或 1
以啟用該選項,以及 FALSE
、OFF
或 0
以停用該選項。 也可以省略 boolean
值,在這種情況下,會假設為 TRUE
。
size
以 KB 為單位指定記憶體量。 大小也可以指定為包含數字大小的字串,後跟下列任何一個記憶體單位:B
(位元組)、kB
(KB)、MB
(MB)、GB
(GB) 或 TB
(TB)。
table_name
要分析的特定表格的名稱(可能包含架構限定詞)。 如果省略,則會分析目前資料庫中的所有常規表格、分割表格和實體化檢視表(但不包括外部表格)。 如果指定的表格是分割表格,則會更新整個分割表格的繼承統計資訊和各個分割區的統計資訊。
column_name
要分析的特定欄位的名稱。 預設為所有欄位。
如果指定 VERBOSE
,ANALYZE
會發出進度訊息,指示目前正在處理哪個表格。 關於表格的各種統計資訊也會被印出。
要分析表格,通常必須擁有表格上的 MAINTAIN
權限。 但是,資料庫擁有者可以分析其資料庫中的所有表格,除了共享目錄。 ANALYZE
將跳過呼叫使用者沒有權限分析的任何表格。
只有在明確選取時才會分析外部表格。 並非所有外部資料包裝器都支援 ANALYZE
。 如果表格的包裝器不支援 ANALYZE
,則該指令會印出警告且不做任何動作。
在預設的 PostgreSQL 設定中,自動清理精靈(參見第 24.1.6 節)會負責在表格首次載入資料時,以及在一般操作過程中表格發生變更時,自動分析表格。當停用自動清理時,最好定期執行 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
設定每個欄位的統計目標來控制。目標值設定了最常見值清單中的最大條目數和直方圖中的最大分箱數。預設目標值為 100,但可以向上或向下調整,以在規劃器預估的準確性與 ANALYZE
所需的時間以及 pg_statistic
中佔用的空間之間進行權衡。特別是,將統計目標設定為零會停用該欄位的統計資訊收集。對於從不用於查詢的 WHERE
、GROUP BY
或 ORDER BY
子句中的欄位,這樣做可能很有用,因為規劃器將無法使用這些欄位的統計資訊。
正在分析的欄位中最大的統計目標決定了用於準備統計資訊的表格列數。增加目標會導致執行 ANALYZE
所需的時間和空間成比例增加。
ANALYZE
預估的值之一是每個欄位中出現的不同值的數量。由於僅檢查了列的子集,因此即使使用最大的統計目標,此預估有時也可能相當不準確。如果這種不準確性導致不良的查詢計畫,則可以手動確定更準確的值,然後使用 ALTER TABLE ... ALTER COLUMN ... SET (n_distinct = ...)
安裝。
如果正在分析的表格有繼承子表格,ANALYZE
會收集兩組統計資訊:一組僅針對父表格的列,另一組包括父表格及其所有子表格的列。當規劃處理整個繼承樹的查詢時,需要第二組統計資訊。在這種情況下,子表格本身不會被單獨分析。但是,自動清理精靈在決定是否觸發該表格的自動分析時,只會考慮父表格本身的插入或更新。如果很少將資料插入或更新到該表格,則除非您手動執行 ANALYZE
,否則繼承統計資訊將不會是最新的。
對於分割表格,ANALYZE
透過對所有分割區中的列進行抽樣來收集統計資訊;此外,它會遞迴到每個分割區並更新其統計資訊。即使是多層分割,每個葉分割區也只會被分析一次。不會收集僅針對父表格(沒有來自其分割區的資料)的統計資訊,因為使用分割保證它是空的。
自動清理精靈不會處理分割表格,也不會處理僅當子表格被修改時的繼承父表格。通常需要定期執行手動 ANALYZE
以保持表格階層的統計資訊為最新狀態。
如果有任何子表格或分割區是外部表格,並且其外部資料包裝器不支援 ANALYZE
,則在收集繼承統計資訊時會忽略這些表格。
如果正在分析的表格完全為空,ANALYZE
將不會為該表格記錄新的統計資訊。任何現有的統計資訊都將被保留。
每個執行 ANALYZE
的後端都會在 pg_stat_progress_analyze
視窗中報告其進度。有關詳細資訊,請參閱第 27.4.1 節。
SQL 標準中沒有 ANALYZE
語法。
以下語法在 PostgreSQL 11 版之前使用,並且仍然支援
ANALYZE [ VERBOSE ] [ table_and_columns
[, ...] ]
如果您在文件中發現任何不正確、與您特定功能的經驗不符或需要進一步澄清的地方,請使用此表格來報告文件問題。