PostgreSQL中ANALYZE命令的使用
ANALYZE 是 PostgreSQL 中用于收集數(shù)據(jù)庫(kù)對(duì)象統(tǒng)計(jì)信息的關(guān)鍵命令,這些統(tǒng)計(jì)信息對(duì)于查詢(xún)優(yōu)化器生成高效執(zhí)行計(jì)劃至關(guān)重要。
一 ANALYZE 命令
1.1 基本語(yǔ)法
ANALYZE [ ( option [, ...] ) ] [ table_and_columns [, ...] ] ANALYZE [ VERBOSE ] [ table_and_columns [, ...] ] where option can be one of: VERBOSE [ boolean ] SKIP_LOCKED [ boolean ] BUFFER_USAGE_LIMIT size and table_and_columns is: table_name [ ( column_name [, ...] ) ]
1.2 鎖級(jí)別
- 不會(huì)鎖表(不阻塞 DML 操作)
- 只獲取
ShareUpdateExclusiveLock
鎖- 允許并發(fā)讀取和寫(xiě)入
- 僅阻塞
ALTER TABLE
、DROP TABLE
、VACUUM FULL
等DDL操作
- 并發(fā)影響:
- ? 允許并發(fā) SELECT/INSERT/UPDATE/DELETE
- ? 允許并發(fā) CREATE INDEX CONCURRENTLY
- ? 阻塞 ALTER TABLE、DROP TABLE、VACUUM FULL
1.3 對(duì)索引的影響
當(dāng)對(duì)表執(zhí)行 ANALYZE
時(shí):
- 會(huì)收集該表所有索引的統(tǒng)計(jì)信息
- 不會(huì)重建或修改索引本身
- 僅更新
pg_statistic
系統(tǒng)目錄中的統(tǒng)計(jì)信息
二 類(lèi)似操作的鎖對(duì)比
命令 | 鎖類(lèi)型 | 是否阻塞DML | 主要用途 |
---|---|---|---|
ANALYZE | ShareUpdateExclusiveLock | 否 | 更新統(tǒng)計(jì)信息 |
REINDEX | 排他鎖 | 是 | 重建索引 |
REINDEX CONCURRENTLY | ShareUpdateExclusiveLock | 否 | 無(wú)鎖重建索引 |
VACUUM | ShareUpdateExclusiveLock | 否 | 清理死元組 |
VACUUM FULL | 排他鎖 | 是 | 重組表數(shù)據(jù) |
三 使用場(chǎng)景
3.1 常規(guī)維護(hù)
-- 分析單個(gè)表 ANALYZE customers; -- 分析特定列 ANALYZE customers (customer_id, name); -- 分析整個(gè)數(shù)據(jù)庫(kù) ANALYZE;
3.2 數(shù)據(jù)大量變更后
-- 批量導(dǎo)入數(shù)據(jù)后 COPY employees FROM '/path/to/data.csv'; ANALYZE employees;
3.3 性能調(diào)優(yōu)
-- 查詢(xún)性能下降時(shí) ANALYZE VERBOSE orders;
四 配置參數(shù)
自動(dòng)分析:
autovacuum_analyze_scale_factor = 0.1 -- 10%行變化后觸發(fā) autovacuum_analyze_threshold = 50 -- 最少50行變化
采樣設(shè)置:
default_statistics_target = 100 -- 統(tǒng)計(jì)信息詳細(xì)程度 alter table large_table set (analyze_sample_percentage = 5); -- 對(duì)大表減少采樣
五 監(jiān)控分析狀態(tài)
查看最后分析時(shí)間:
SELECT schemaname, relname, last_analyze, analyze_count FROM pg_stat_user_tables;
輸出示例:
schemaname | relname | last_analyze | analyze_count ------------+------------------+-------------------------------+--------------- yewu1 | t4 | | 0 yewu1 | t1 | 2025-05-03 18:51:47.366276-07 | 1 yewu1 | t2 | | 0 public | pgbench_history | | 0 yewu1 | test6 | | 0 public | pgbench_tellers | | 0 yewu1 | test5 | | 0 public | pgbench_branches | | 0 yewu1 | test3 | | 0 yewu1 | test2 | | 0 yewu1 | t3 | | 0 public | pgbench_accounts | | 0 yewu1 | test10 | | 0 yewu1 | test4 | | 0 (14 rows)
檢查待分析變更量:
SELECT schemaname, relname, n_mod_since_analyze, n_live_tup, round(n_mod_since_analyze*100.0/nullif(n_live_tup,0),2) as mod_percent FROM pg_stat_user_tables ORDER BY n_mod_since_analyze DESC;
輸出示例:
schemaname | relname | n_mod_since_analyze | n_live_tup | mod_percent ------------+------------------+---------------------+------------+------------- yewu1 | t3 | 190 | 10 | 1900.00 yewu1 | test10 | 4 | 4 | 100.00 yewu1 | t2 | 0 | 10000 | 0.00 public | pgbench_history | 0 | 0 | yewu1 | test6 | 0 | 0 | public | pgbench_tellers | 0 | 0 | yewu1 | test5 | 0 | 0 | public | pgbench_branches | 0 | 0 | yewu1 | test3 | 0 | 0 | yewu1 | test2 | 0 | 0 | public | pgbench_accounts | 0 | 0 | yewu1 | t4 | 0 | 10000 | 0.00 yewu1 | test4 | 0 | 0 | yewu1 | t1 | 0 | 0 | (14 rows)
六 性能考慮
資源使用:
- 會(huì)消耗CPU和I/O資源
- 對(duì)大表可能耗時(shí)較長(zhǎng)
最佳實(shí)踐:
- 在低峰期執(zhí)行大表分析
- 對(duì)關(guān)鍵表設(shè)置更頻繁的自動(dòng)分析
- 超大表考慮減小采樣比例
七 與VACUUM的區(qū)別
特性 | ANALYZE | VACUUM |
---|---|---|
主要目的 | 收集統(tǒng)計(jì)信息 | 清理死元組 |
鎖級(jí)別 | ShareUpdateExclusive | 同左(但VACUUM FULL為排他鎖) |
是否回收空間 | 否 | 是(VACUUM FULL) |
更新統(tǒng)計(jì)信息 | 是 | 可選(ANALYZE選項(xiàng)) |
更多詳細(xì)信息請(qǐng)查看官方文檔:https://www.postgresql.org/docs/16/sql-analyze.html
PostgreSQL 中的 ANALYZE
命令不會(huì)鎖表,是安全的維護(hù)操作,可以隨時(shí)在生產(chǎn)環(huán)境執(zhí)行。如果需要重建索引(而非更新統(tǒng)計(jì)信息),則應(yīng)使用 REINDEX
命令,并注意其鎖行為。
到此這篇關(guān)于PostgreSQL中ANALYZE命令的使用的文章就介紹到這了,更多相關(guān)PostgreSQL ANALYZE內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 15個(gè)postgresql數(shù)據(jù)庫(kù)實(shí)用命令分享
- PostgreSql新手必學(xué)入門(mén)命令小結(jié)
- PostgreSQL中的psql命令詳解
- PostgreSQL中的VACUUM命令用法說(shuō)明
- postgreSQL數(shù)據(jù)庫(kù)默認(rèn)用戶postgres常用命令分享
- PostgreSQL教程(十七):客戶端命令(1)
- PostgreSQL數(shù)據(jù)庫(kù)命令行執(zhí)行SQL腳本的三種方式
- PostgreSQL教程(十八):客戶端命令(2)
- PostgreSQL psql 常用命令總結(jié)
相關(guān)文章
postgresql 除法保留小數(shù)位的實(shí)例
這篇文章主要介紹了postgresql 除法保留小數(shù)位的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01postgreSQL數(shù)據(jù)庫(kù)默認(rèn)用戶postgres常用命令分享
這篇文章主要介紹了postgreSQL數(shù)據(jù)庫(kù)默認(rèn)用戶postgres常用命令分享,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01PostgreSQL之分區(qū)表(partitioning)
通過(guò)合理的設(shè)計(jì),可以將選擇一定的規(guī)則,將大表切分多個(gè)不重不漏的子表,這就是傳說(shuō)中的partitioning。比如,我們可以按時(shí)間切分,每天一張子表,比如我們可以按照某其他字段分割,總之了就是化整為零,提高查詢(xún)的效能2016-11-11Postgresql 實(shí)現(xiàn)查詢(xún)一個(gè)表/所有表的所有列名
這篇文章主要介紹了Postgresql 實(shí)現(xiàn)查詢(xún)一個(gè)表/所有表的所有列名,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12Vcenter清理/storage/archive空間的處理方式
通過(guò)SSH登陸到Vcenter并檢查/storage/archive目錄發(fā)現(xiàn)占用過(guò)高,該目錄用于存儲(chǔ)歸檔的日志文件和歷史數(shù)據(jù),解決方案是保留近30天的歸檔文件,這篇文章主要給大家介紹了關(guān)于Vcenter清理/storage/archive空間的處理方式,需要的朋友可以參考下2024-11-11PostgreSQL中實(shí)現(xiàn)數(shù)據(jù)實(shí)時(shí)監(jiān)控和預(yù)警的步驟詳解
在 PostgreSQL 中實(shí)現(xiàn)數(shù)據(jù)的實(shí)時(shí)監(jiān)控和預(yù)警是確保數(shù)據(jù)庫(kù)性能和數(shù)據(jù)完整性的關(guān)鍵任務(wù),以下將詳細(xì)討論如何實(shí)現(xiàn)此目標(biāo),并提供相應(yīng)的解決方案和具體示例,需要的朋友可以參考下2024-07-07