正確的統計信息是查詢優化器選擇高效的查詢計劃的必要條件,如果統計信息不存在或者信息過時,優化器可能會生成低效的查詢計劃。使用ANALYZE語句可以更新統計信息。
ANALYZE使用命令如下:
ANALYZE [VERBOSE] [ROOTPARTITION [ALL] ] [table [ (column [, ...] ) ]]
AUTO ANALYZE
AUTO ANALYZE可以自動執行ANALYZE命令。AUTO ANALYZE將檢查具有大量插入、更新或刪除的表,并在需要的時候主動對表執行ANALYZE來收集更新表的統計信息。當前默認情況下,當表改動行數超過10%時,AUTO ANALYZE會自動對表觸發一次ANALYZE操作。
對于MULTI MASTER實例,當前暫時只能追蹤主MASTER上發生的改動行為,輔助MASTER發生的改動行為將不會觸發AUTO ANALYZE。
選擇生成統計信息
不帶參數運行ANALYZE會為數據庫中所有的表更新統計信息,運行時間可能會很長。用戶可以指定表名或者列名來指定收集單個表或者某些列的統計信息。當數據被改變時,應該有選擇地ANALYZE表。
在大表上運行ANALYZE可能需要很長時間,用戶可以只使用ANALYZE table(column, ...)
為選擇的列生成統計信息,例如收集用在連接、WHERE子句、SORT子句、GROUP BY子句或者HAVING子句中的那些列。對于一個分區表,用戶可以在pg_partitions系統目錄中尋找分區表的名字,只在更改過的分區上運行ANALYZE:
SELECT partitiontablename from pg_partitions WHERE tablename='parent_table';
何時運行ANALYZE
在以下時候運行ANALYZE:
- 導入數據之后。
- CREATE INDEX之后。
- 在做大量的INSERT、UPDATE以及DELETE操作之后。
ANALYZE會在表上要求一個讀鎖,因此它可以與其他數據庫活動并行運行,但不要在執行導入、INSERT、UPDATE、DELETE以及CREATE INDEX操作期間運行ANALYZE。