LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

PostgreSQL性能優(yōu)化之體系結(jié)構(gòu)

admin
2024年7月25日 21:15 本文熱度 805

本文介紹 PostgreSQL 數(shù)據(jù)庫(kù)的體系結(jié)構(gòu),包括實(shí)例結(jié)構(gòu)(進(jìn)程與內(nèi)存)、存儲(chǔ)結(jié)構(gòu)(物理與邏輯)以及插件式存儲(chǔ)引擎。

實(shí)例與數(shù)據(jù)庫(kù)聚簇

PostgreSQL 使用典型的客戶端/服務(wù)器(Client/Server)架構(gòu),客戶端發(fā)送請(qǐng)求到服務(wù)端,服務(wù)端處理完成之后返回結(jié)果到客戶端。下圖顯示了一個(gè)簡(jiǎn)化的 PostgreSQL 體系結(jié)構(gòu):

PostgreSQL 客戶端可能是一個(gè)命令行工具、圖形工具或者 Web 服務(wù)器,它們是數(shù)據(jù)庫(kù)操作的請(qǐng)求者。

PostgreSQL 服務(wù)端由一個(gè)實(shí)例(Instance)以及一個(gè)數(shù)據(jù)庫(kù)聚簇(Database Cluster)組成。

實(shí)例由一組后臺(tái)進(jìn)程和相關(guān)的內(nèi)存組成,用于管理數(shù)據(jù)庫(kù)。啟動(dòng)服務(wù)器進(jìn)程時(shí)創(chuàng)建一個(gè)實(shí)例,關(guān)閉服務(wù)器進(jìn)程時(shí)實(shí)例隨之關(guān)閉。

數(shù)據(jù)庫(kù)聚簇包含多個(gè)數(shù)據(jù)庫(kù),一個(gè)數(shù)據(jù)庫(kù)由一組相關(guān)的對(duì)象組成,例如表、索引、視圖、存儲(chǔ)過(guò)程等。

提示:PostgreSQL 數(shù)據(jù)庫(kù)聚簇代表了單個(gè)主機(jī)上單個(gè)實(shí)例管理的一組數(shù)據(jù)庫(kù),它不是由一組數(shù)據(jù)庫(kù)服務(wù)器組成的集群。

客戶端和服務(wù)端通常位于不同的主機(jī)中,它們之間通過(guò) TCP/IP 網(wǎng)絡(luò)協(xié)議進(jìn)行連接和通信,默認(rèn)端口為 5432。當(dāng)客戶端和服務(wù)端位于相同的主機(jī)時(shí),也可以通過(guò) Unix 域套接字進(jìn)行通信。

實(shí)例結(jié)構(gòu)

PostgreSQL 實(shí)例由一組進(jìn)程和相關(guān)的內(nèi)存組成,用于管理物理數(shù)據(jù)庫(kù)。下圖描述了實(shí)例的結(jié)構(gòu):

每當(dāng)客戶端進(jìn)程請(qǐng)求連接數(shù)據(jù)庫(kù)時(shí),PostgreSQL 服務(wù)進(jìn)程(postgres)負(fù)責(zé)監(jiān)聽(tīng)連接請(qǐng)求并驗(yàn)證客戶端信息。驗(yàn)證通過(guò)之后主服務(wù)進(jìn)程會(huì)為每一個(gè)客戶端連接創(chuàng)建一個(gè)新的后端進(jìn)程,然后客戶端進(jìn)程和對(duì)應(yīng)的后端進(jìn)程(postgres)直接通信,后端進(jìn)程代表客戶端執(zhí)行各種數(shù)據(jù)庫(kù)操作并返回結(jié)果。

數(shù)據(jù)庫(kù)進(jìn)程

PostgreSQL?服務(wù)進(jìn)程(server process)是其他進(jìn)程的父進(jìn)程,當(dāng)我們啟動(dòng) PostgreSQL 服務(wù)時(shí)首先會(huì)創(chuàng)建該進(jìn)程,然后它再分配共享內(nèi)存(shared memory)并啟動(dòng)各種后臺(tái)進(jìn)程。服務(wù)進(jìn)程還負(fù)責(zé)監(jiān)聽(tīng)客戶端連接請(qǐng)求,默認(rèn)監(jiān)聽(tīng)端口為 5432。在早期版本中,PostgreSQL 服務(wù)進(jìn)程也被稱為 postmaster。

PostgreSQL?后端進(jìn)程(backend process)用于代表客戶端執(zhí)行數(shù)據(jù)庫(kù)操作,服務(wù)進(jìn)程在驗(yàn)證客戶端連接請(qǐng)求后為其創(chuàng)建新的后端進(jìn)程,在客戶端斷開(kāi)連接時(shí)終止對(duì)應(yīng)的后端進(jìn)程。

提示:PostgreSQL 使用類似 Oracle 中的專用服務(wù)器模式,每個(gè)客戶端進(jìn)程連接到一個(gè)專用的后端進(jìn)程。后端進(jìn)程在客戶端會(huì)話期間不被任何其他客戶端共享。每個(gè)新的會(huì)話都會(huì)分配一個(gè)專用的后端進(jìn)程。

PostgreSQL 支持的最大客戶端連接數(shù)由系統(tǒng)參數(shù) max_connections 控制,默認(rèn)值為 100。

PostgreSQL?后臺(tái)進(jìn)程(background processes)用于執(zhí)行各種數(shù)據(jù)庫(kù)管理操作,主要包括:

  • 后臺(tái)寫進(jìn)程(background writer),負(fù)責(zé)定期將共享緩沖池(shared buffer pool)中的臟頁(yè)寫入磁盤。

  • 檢查點(diǎn)進(jìn)程(checkpointer),發(fā)生檢查點(diǎn)時(shí)負(fù)責(zé)將檢查點(diǎn)記錄寫入 WAL 段文件,同時(shí)刷新共享緩沖池中的臟頁(yè)。

  • 自動(dòng)清理啟動(dòng)進(jìn)程(autovacuum launcher),定期調(diào)用工作進(jìn)程(autovacuum worker)完成清理工作。

  • WAL 寫進(jìn)程(wal writer),定期將 WAL 緩沖數(shù)據(jù)寫入 WAL 段文件。

  • 統(tǒng)計(jì)收集進(jìn)程(stats collector),收集數(shù)據(jù)庫(kù)系統(tǒng)運(yùn)行的統(tǒng)計(jì)信息,PostgreSQL 15 版本優(yōu)化刪除。

  • 歸檔進(jìn)程(archiver),負(fù)責(zé) WAL 段文件歸檔,也就是日志歸檔。

  • 日志收集進(jìn)程(logger),記錄數(shù)據(jù)庫(kù)錯(cuò)誤日志。

除了以上進(jìn)程之外,PostgreSQL 還會(huì)基于不同配置啟動(dòng)其他后臺(tái)進(jìn)程。例如,流復(fù)制相關(guān)的 walsender(發(fā)送 WAL 數(shù)據(jù))以及 walreceiver(接收 WAL 數(shù)據(jù))進(jìn)程,用戶自定義實(shí)現(xiàn)的后臺(tái)工作進(jìn)程(Background Worker Process)等。

后臺(tái)寫進(jìn)程

后臺(tái)寫進(jìn)程負(fù)責(zé)定期將共享緩沖池中的臟頁(yè)寫入磁盤,默認(rèn)情況下每隔 200 毫秒(bgwriter_delay)刷新一次磁盤,每次最多刷新 100 個(gè)緩沖頁(yè)(bgwriter_lru_maxpages)。這種刷新臟頁(yè)的方式可以盡量減少對(duì)數(shù)據(jù)庫(kù)性能的影響。

另外,PostgreSQL 9.1 版本之前,后臺(tái)寫進(jìn)程還需要負(fù)責(zé)檢查點(diǎn)過(guò)程。PostgreSQL 9.2 開(kāi)始,單獨(dú)的檢查點(diǎn)進(jìn)程開(kāi)始負(fù)責(zé)這部分工作。

檢查點(diǎn)進(jìn)程

檢查點(diǎn)進(jìn)程負(fù)責(zé)檢查點(diǎn)(Checkpoint)操作,也就是將檢查點(diǎn)記錄寫入 WAL 段文件并且刷新共享緩沖池中的全部臟頁(yè)。

以下情況都會(huì)觸發(fā)檢查點(diǎn)操作:

  1. 距離上一次檢查點(diǎn)操作的時(shí)間間隔到達(dá)參數(shù) checkpoint_timeout 的配置,默認(rèn)為 300 秒。

  2. PostgreSQL 9.4 以及更低版本,上一次檢查點(diǎn)操作之后寫入的 WAL 段文件數(shù)據(jù)到達(dá)參數(shù) checkpoint_segments 的配置,默認(rèn)值為 3。

  3. PostgreSQL 9.5 以及更高版本,pg_wal(pg_xlog)目錄中 WAL 段文件總大小超過(guò)參數(shù) max_wal_size 的配置,默認(rèn)值為 1 GB。

  4. PostgreSQL 數(shù)據(jù)庫(kù)服務(wù)以 smart(SIGTERM)或者 fast(SIGINT)模式關(guān)閉。

  5. 超級(jí)用戶或者 pg_checkpoint 特權(quán)用戶手動(dòng)執(zhí)行 CHECKPOINT 命令。

檢查點(diǎn)機(jī)制可以將內(nèi)存中的臟數(shù)據(jù)刷新到磁盤,并且生成一個(gè)一致性的數(shù)據(jù)庫(kù)狀態(tài)。系統(tǒng)崩潰后,執(zhí)行數(shù)據(jù)庫(kù)恢復(fù)時(shí)可以從最近的檢查點(diǎn)開(kāi)始,優(yōu)化恢復(fù)性能。

自動(dòng)清理啟動(dòng)進(jìn)程

自動(dòng)清理啟動(dòng)進(jìn)程負(fù)責(zé)定期調(diào)用工作進(jìn)程執(zhí)行清理流程(VACUUM 以及 ANALYZE),默認(rèn)情況下每隔 1 分鐘(autovacuum_naptime)運(yùn)行一次,每次最多調(diào)用 3 個(gè)(autovacuum_max_workers)工作進(jìn)程。

WAL 寫進(jìn)程

WAL 寫進(jìn)程負(fù)責(zé)定期將 WAL 緩沖數(shù)據(jù)(XLOG)寫入 WAL 段文件,這些文件位于 pg_wal 子目錄中。

WAL 寫進(jìn)程默認(rèn) 200 毫秒(wal_writer_delay)刷新一次緩沖,可以避免一次提交大量數(shù)據(jù)時(shí)的磁盤寫入瓶頸。

統(tǒng)計(jì)收集進(jìn)程

PostgreSQL 14 以及之前的版本中存在統(tǒng)計(jì)收集進(jìn)程,負(fù)責(zé)收集系統(tǒng)運(yùn)行時(shí)的統(tǒng)計(jì)信息,并且通過(guò) pg_stat_activity 等動(dòng)態(tài)視圖提供數(shù)據(jù)。

PostgreSQL 15 版本開(kāi)始使用累積統(tǒng)計(jì)系統(tǒng),基于共享內(nèi)存存儲(chǔ)統(tǒng)計(jì)信息,優(yōu)化了性能,同時(shí)刪除了獨(dú)立的統(tǒng)計(jì)收集進(jìn)程。

歸檔進(jìn)程

歸檔進(jìn)程負(fù)責(zé) WAL 段文件的連續(xù)歸檔,在發(fā)生 WAL 段切換時(shí)將其復(fù)制到歸檔區(qū)域。日志歸檔功能可以用于物理熱備以及即時(shí)點(diǎn)恢復(fù)(PITR)。

如果想要啟動(dòng) WAL 歸檔,需要將配置參數(shù) wal_level 設(shè)置為 replica 或者更高級(jí)別,同時(shí)將配置參數(shù) archive_mode 設(shè)置為 on,然后在 archive_command 參數(shù)中設(shè)置歸檔命令或者在 archive_library 參數(shù)中指定歸檔模塊。

日志收集進(jìn)程

日志收集進(jìn)程負(fù)責(zé)將錯(cuò)誤信息記錄到錯(cuò)誤日志文件,該進(jìn)程由配置參數(shù) logging_collector 控制,默認(rèn)設(shè)置為 on。

內(nèi)存結(jié)構(gòu)

PostgreSQL 實(shí)例的內(nèi)存結(jié)構(gòu)可以分為以下兩個(gè)大類:

  • 共享內(nèi)存區(qū)(Shared Memory Area)。

  • 本地內(nèi)存區(qū)(Local Memory Area)。

共享內(nèi)存區(qū)

PostgreSQL 實(shí)例啟動(dòng)時(shí)分配共享內(nèi)存區(qū),它是所有服務(wù)端進(jìn)程共享的內(nèi)存區(qū),具體可以分為共享緩沖池(shared buffer pool)、WAL 緩沖(WAL buffer)、提交日志緩沖(CLOG)等。

共享緩沖池用于加載磁盤中的表和索引數(shù)據(jù),并且在內(nèi)存中進(jìn)行操作,從而減少磁盤 I/O,提高性能。共享緩沖池的大小通過(guò)參數(shù) shared_buffers 進(jìn)行配置,默認(rèn)值為 128 MB。

雖然對(duì)于 shared_buffers 沒(méi)有具體的推薦值,但是可以針對(duì)具體的系統(tǒng)計(jì)算出一個(gè)大概的值。一般來(lái)說(shuō),對(duì)于專用的數(shù)據(jù)庫(kù)服務(wù)器,shared_buffers 大概可以設(shè)置為系統(tǒng)內(nèi)存的 25%。增加 shared_buffers 的值通常可以提高性能,例如,當(dāng)整個(gè)數(shù)據(jù)庫(kù)都可以被加載到緩存中時(shí),可以明顯減少磁盤的讀取操作。由于 PostgreSQL 還依賴于操作系統(tǒng)的緩存,大于內(nèi)存 40% 的 shared_buffers 并不會(huì)帶來(lái)性能的提示,反而可能會(huì)下降。

另外,增加 shared_buffers 的值通常也需要相應(yīng)地增加 max_wal_size 的值,以便延長(zhǎng)檢查點(diǎn)的時(shí)間間隔。

PostgreSQL 使用預(yù)寫日志(WAL)確保數(shù)據(jù)的持久性;與 shared_buffers 作用類似,PostgreSQL 將 WAL 日志(XLOG)寫入緩沖并且批量寫入磁盤。

默認(rèn)的 WAL 緩沖大小由 wal_buffers 參數(shù)進(jìn)行設(shè)置,初始值為 4MB(shared_buffers 的 1/32)。WAL 緩沖區(qū)在每次事務(wù)提交時(shí)都會(huì)寫入磁盤,因此過(guò)大的值并不會(huì)帶來(lái)顯著的性能提升。不過(guò),對(duì)于大量并發(fā)的寫入操作,適當(dāng)增加該參數(shù)的值可以提高系統(tǒng)的性能。

CLOG 緩沖存儲(chǔ)了每個(gè)事務(wù)的狀態(tài)(IN_PROGRESS、COMMITTED、ABORTED 以及 SUB_COMMITTED),用戶事務(wù)管理和并發(fā)控制。當(dāng) PostgreSQL 關(guān)閉服務(wù)或者執(zhí)行檢查點(diǎn)過(guò)程時(shí),會(huì)將 CLOG 數(shù)據(jù)寫入 pg_xact(pg_clog)子目錄文件中;當(dāng) PostgreSQL 服務(wù)啟動(dòng)時(shí),會(huì)從文件中加載初始 CLOG。

共享內(nèi)存區(qū)還包括許多其他子區(qū),例如用于實(shí)現(xiàn)各種訪問(wèn)控制機(jī)制(信號(hào)量、輕量級(jí)鎖、共享鎖、排他鎖等)的內(nèi)存,各種后臺(tái)進(jìn)程(checkpointer、autovacuum 等)使用的內(nèi)存,事務(wù)處理(保存點(diǎn)、兩階段提交等)所需的內(nèi)存。

本地內(nèi)存區(qū)

本地內(nèi)存區(qū)是為每個(gè)后端進(jìn)程動(dòng)態(tài)分配的獨(dú)享內(nèi)存區(qū),用于執(zhí)行查詢處理、數(shù)據(jù)排序、哈希連接等操作,以及存儲(chǔ)臨時(shí)表和會(huì)話級(jí)別的數(shù)據(jù)。

本地內(nèi)存區(qū)主要包括工作內(nèi)存(work_mem)、維護(hù)工作內(nèi)存(maintenance_work_mem)以及臨時(shí)緩沖(temp_buffers)。

工作內(nèi)存用于查詢處理過(guò)程中的數(shù)據(jù)排序(ORDER BY、DISTINCT)以及表之間的連接(Hash Join、Sort Merge Join)等操作。工作內(nèi)存由參數(shù) work_mem 進(jìn)行配置,默認(rèn)為 4 MB。

如果設(shè)置了合適的 work_mem,大部分的排序操作都在內(nèi)存中執(zhí)行,而不需要使用磁盤存儲(chǔ)臨時(shí)結(jié)果。對(duì)于復(fù)雜的查詢,可能會(huì)執(zhí)行并發(fā)的排序或者哈希操作,每個(gè)操作都可以最多使用該參數(shù)設(shè)置的內(nèi)存。另外,多個(gè)會(huì)話可能同時(shí)執(zhí)行排序操作。因此,排序占用的總內(nèi)存可能是 work_mem 的許多倍;work_mem 的值不能設(shè)置的過(guò)高,因?yàn)樗赡軐?dǎo)致內(nèi)存使用瓶頸。

維護(hù)工作內(nèi)存主要用于數(shù)據(jù)庫(kù)維護(hù)操作,例如 VACUUM、CREATE INDEX 以及 ALTER TABLE ADD FOREIGN KEY 等操作。這些操作在執(zhí)行時(shí)可能需要較大的內(nèi)存空間來(lái)優(yōu)化性能。

配置參數(shù) maintenance_work_mem 指定了維護(hù)工作內(nèi)存的大小,默認(rèn)值為 64 MB。由于一個(gè)數(shù)據(jù)庫(kù)會(huì)話同時(shí)只能執(zhí)行一個(gè)維護(hù)操作,一般不會(huì)存在并發(fā)的維護(hù)操作;所以將該參數(shù)設(shè)置的比 work_mem 大很多也不會(huì)有問(wèn)題,更大的維護(hù)內(nèi)存還能夠提高數(shù)據(jù)庫(kù)清理和數(shù)據(jù)導(dǎo)入的性能。

臨時(shí)緩沖用于存儲(chǔ)臨時(shí)表數(shù)據(jù)。每個(gè)會(huì)話都可以使用單獨(dú)的臨時(shí)緩沖來(lái)存儲(chǔ)臨時(shí)表的數(shù)據(jù),以提高訪問(wèn)效率。

配置參數(shù) temp_buffers 用于設(shè)置臨時(shí)緩沖的大小,默認(rèn)為 8MB。

存儲(chǔ)結(jié)構(gòu)

一個(gè) PostgreSQL 實(shí)例管理一個(gè)數(shù)據(jù)庫(kù)聚簇,它可以包含多個(gè)數(shù)據(jù)庫(kù)。這里的聚簇不是多臺(tái)服務(wù)器組成的集群。

物理存儲(chǔ)

一個(gè)數(shù)據(jù)庫(kù)聚簇通常對(duì)應(yīng)操作系統(tǒng)中的一個(gè)目錄,也就是根目錄(PGDATA)。使用 SHOW 命令查看如下:

SHOW data_directory;

data_directory ? ? ? ? ? ? ? ? ? ? |
-----------------------------------+
D:/Program Files/PostgreSQL/17/data|

根目錄包含多個(gè)子目錄和文件:

PS D:\Program Files\PostgreSQL\17\data> ls

Mode ? ? ? ? ? ? ? ? LastWriteTime ? ? ? ? Length Name
---- ? ? ? ? ? ? ? ? ------------- ? ? ? ? ------ ----
d----- ? ? ? ? 2024/6/17 ? ? 10:44 ? ? ? ? ? ? ? ?base
d----- ? ? ? ? 2024/7/11 ? ? 14:35 ? ? ? ? ? ? ? ?global
d----- ? ? ? ? 2024/7/22 ? ? 17:08 ? ? ? ? ? ? ? ?log
d----- ? ? ? ? 2024/6/17 ? ? 10:44 ? ? ? ? ? ? ? ?pg_commit_ts
d----- ? ? ? ? 2024/6/17 ? ? 10:44 ? ? ? ? ? ? ? ?pg_dynshmem
d----- ? ? ? ? 2024/7/11 ? ? 14:39 ? ? ? ? ? ? ? ?pg_logical
d----- ? ? ? ? 2024/6/17 ? ? 10:44 ? ? ? ? ? ? ? ?pg_multixact
d----- ? ? ? ? 2024/6/17 ? ? 10:44 ? ? ? ? ? ? ? ?pg_notify
d----- ? ? ? ? 2024/6/17 ? ? 10:44 ? ? ? ? ? ? ? ?pg_replslot
d----- ? ? ? ? 2024/6/17 ? ? 10:44 ? ? ? ? ? ? ? ?pg_serial
d----- ? ? ? ? 2024/6/17 ? ? 10:44 ? ? ? ? ? ? ? ?pg_snapshots
d----- ? ? ? ? 2024/7/11 ? ? 14:34 ? ? ? ? ? ? ? ?pg_stat
d----- ? ? ? ? 2024/6/17 ? ? 10:44 ? ? ? ? ? ? ? ?pg_stat_tmp
d----- ? ? ? ? 2024/6/17 ? ? 10:44 ? ? ? ? ? ? ? ?pg_subtrans
d----- ? ? ? ? 2024/6/17 ? ? 10:44 ? ? ? ? ? ? ? ?pg_tblspc
d----- ? ? ? ? 2024/6/17 ? ? 10:44 ? ? ? ? ? ? ? ?pg_twophase
d----- ? ? ? ? 2024/6/17 ? ? 10:44 ? ? ? ? ? ? ? ?pg_wal
d----- ? ? ? ? 2024/6/17 ? ? 10:44 ? ? ? ? ? ? ? ?pg_xact
-a---- ? ? ? ? 2024/7/23 ? ? 17:16 ? ? ? ? ? ? 45 current_logfiles
-a---- ? ? ? ? 2024/6/17 ? ? 10:44 ? ? ? ? ? 5639 pg_hba.conf
-a---- ? ? ? ? 2024/6/17 ? ? 10:44 ? ? ? ? ? 2712 pg_ident.conf
-a---- ? ? ? ? 2024/6/17 ? ? 10:44 ? ? ? ? ? ? ?3 PG_VERSION
-a---- ? ? ? ? 2024/6/17 ? ? 10:44 ? ? ? ? ? ? 90 postgresql.auto.conf
-a---- ? ? ? ? 2024/6/17 ? ? 10:44 ? ? ? ? ?31602 postgresql.conf
-a---- ? ? ? ? 2024/7/11 ? ? 14:34 ? ? ? ? ? ? 91 postmaster.opts
-a---- ? ? ? ? 2024/7/11 ? ? 14:34 ? ? ? ? ? ? 70 postmaster.pid

下表列出了這些目錄和文件的描述。

項(xiàng)目類型描述
base目錄包含多個(gè)子目錄,每個(gè)目錄對(duì)應(yīng)一個(gè)數(shù)據(jù)庫(kù)。
global目錄存儲(chǔ)全局(聚簇)級(jí)別的數(shù)據(jù)表,例如 pg_database 等。控制文件也存儲(chǔ)在這個(gè)目錄中。
log目錄存儲(chǔ)服務(wù)器日志信息。
pg_commit_ts目錄保存事務(wù)提交時(shí)間戳數(shù)據(jù)。
pg_dynshmem目錄存儲(chǔ)動(dòng)態(tài)共享內(nèi)存子系統(tǒng)使用的文件。
pg_logical目錄存儲(chǔ)邏輯解碼狀態(tài)數(shù)據(jù)。
pg_multixact目錄存儲(chǔ)用于共享行鎖的多事務(wù)(multitransaction)狀態(tài)數(shù)據(jù)。
pg_notify目錄存儲(chǔ) LISTEN/NOTIFY(消息通知機(jī)制)狀態(tài)數(shù)據(jù)。
pg_replslot目錄存儲(chǔ)復(fù)制槽數(shù)據(jù)。
pg_serial目錄存儲(chǔ)已提交的串行化事務(wù)信息。
pg_snapshots目錄存儲(chǔ)導(dǎo)出的快照。
pg_stat目錄存儲(chǔ)統(tǒng)計(jì)子系統(tǒng)使用的持久化文件。
pg_stat_tmp目錄存儲(chǔ)統(tǒng)計(jì)子系統(tǒng)使用的臨時(shí)文件。
pg_subtrans目錄存儲(chǔ)子事務(wù)狀態(tài)數(shù)據(jù)。
pg_tblspc目錄存儲(chǔ)表空間目錄的符號(hào)鏈接。
pg_twophase目錄存儲(chǔ)預(yù)備事務(wù)(兩階段提交)的狀態(tài)文件。
pg_wal目錄存儲(chǔ)預(yù)寫式日志(WAL)文件。
pg_xact目錄存儲(chǔ)事務(wù)提交狀態(tài)數(shù)據(jù)。
current_logfiles文件記錄當(dāng)前寫入的服務(wù)器日志文件。
pg_hba.conf文件客戶端認(rèn)證配置文件。
pg_ident.conf文件用戶名映射文件。
PG_VERSION文件記錄 PostgreSQL 主版本號(hào)。
postgresql.auto.conf文件存儲(chǔ)使用 ALTER SYSTEM 命令設(shè)置的參數(shù)信息。
postgresql.conf文件主配置參數(shù)文件。
postmaster.opts文件記錄服務(wù)器上次啟動(dòng)時(shí)使用的命令行選項(xiàng)。
postmaster.pid文件記錄主服務(wù)進(jìn)程 ID,數(shù)據(jù)庫(kù)聚簇根目錄,主服務(wù)進(jìn)程啟動(dòng)時(shí)間戳,服務(wù)端口、Unix 域套接字目錄(可空),第一個(gè)有效的監(jiān)聽(tīng)地址以及共享內(nèi)存段 ID 等信息。該文件在服務(wù)啟動(dòng)時(shí)創(chuàng)建,服務(wù)停止時(shí)刪除。

其中,base 子目錄存儲(chǔ)了每個(gè)數(shù)據(jù)庫(kù)的數(shù)據(jù)文件和索引文件等內(nèi)容:

PS D:\Program Files\PostgreSQL\17\data\base> ls

Mode ? ? ? ? ? ? ? ? LastWriteTime ? ? ? ? Length Name
---- ? ? ? ? ? ? ? ? ------------- ? ? ? ? ------ ----
d----- ? ? ? ? 2024/6/20 ? ? ?9:09 ? ? ? ? ? ? ? ?1
d----- ? ? ? ? 2024/6/17 ? ? 10:44 ? ? ? ? ? ? ? ?4
d----- ? ? ? ? 2024/7/11 ? ? 14:35 ? ? ? ? ? ? ? ?5

每個(gè)數(shù)字子目錄對(duì)應(yīng)一個(gè)數(shù)據(jù)庫(kù)的標(biāo)識(shí)符(OID),使用 SQL 查詢數(shù)據(jù)庫(kù)信息如下:

select oid, datname
from pg_database;

oid|datname ?|
---+---------+
?5|postgres |
?1|template1|
?4|template0|

數(shù)據(jù)庫(kù)中的對(duì)象存儲(chǔ)在各自的子目錄中,pg_relation_filepath 函數(shù)可以用于查詢對(duì)象的文件路徑(相對(duì)于根目錄):

SELECT pg_relation_filepath('public.animal');

pg_relation_filepath|
--------------------+
base/5/73734 ? ? ? ?|

animal 是數(shù)據(jù)庫(kù) postgres 中的一個(gè)表,它的 OID 為 73734,數(shù)據(jù)文件為根目錄下的 base/5/73734。

表空間

在 PostgreSQL 中,表空間(tablespace)表示數(shù)據(jù)文件的存放目錄,這些數(shù)據(jù)文件代表了數(shù)據(jù)庫(kù)的對(duì)象,例如表或索引。創(chuàng)建數(shù)據(jù)庫(kù)對(duì)象時(shí),只需要指定存儲(chǔ)對(duì)象的表空間的名稱(或者使用默認(rèn)值),而不需要指定磁盤上的物理路徑。當(dāng)我們?cè)L問(wèn)表時(shí),系統(tǒng)通過(guò)它所在的表空間定位到對(duì)應(yīng)數(shù)據(jù)文件所在的位置。

PostgreSQL 中的表空間與其他數(shù)據(jù)庫(kù)系統(tǒng)不太一樣,它更偏向于一個(gè)物理上的概念。

表空間的引入為 PostgreSQL 的管理帶來(lái)了以下好處:

  • 如果數(shù)據(jù)庫(kù)集群所在的初始磁盤分區(qū)或磁盤卷的空間不足,又無(wú)法進(jìn)行擴(kuò)展,可以在其他分區(qū)上創(chuàng)建一個(gè)新的表空間以供使用。

  • 管理員可以根據(jù)數(shù)據(jù)庫(kù)對(duì)象的使用統(tǒng)計(jì)優(yōu)化系統(tǒng)的性能。例如,可以將訪問(wèn)頻繁的索引存放到一個(gè)非常快速且可靠的磁盤上,比如昂貴的固態(tài)硬盤。與此同時(shí),將很少使用或者對(duì)性能要求不高的歸檔數(shù)據(jù)表存儲(chǔ)到廉價(jià)的低速磁盤上。

PostgreSQL 在集群初始化時(shí)將默認(rèn)創(chuàng)建了兩個(gè)表空間:

  • pg_default, template1 和 template0 默認(rèn)的表空間,也是創(chuàng)建其他數(shù)據(jù)庫(kù)時(shí)的默認(rèn)表空間;對(duì)應(yīng)的目錄為 PGDATA/base。

  • pg_global,用于存儲(chǔ)一些集群級(jí)別的共享系統(tǒng)表(system catalogs),例如 pg_database、pg_control;對(duì)應(yīng)的目錄為 PGDATA/global。

創(chuàng)建表和索引時(shí)的默認(rèn)表空間使用參數(shù) default_tablespace 進(jìn)行配置。使用 CREATE 命令指定表空間的語(yǔ)法如下:

CREATE TABLE ...
TABLESPACE ts_name;

邏輯存儲(chǔ)

一個(gè)數(shù)據(jù)庫(kù)聚簇包含多個(gè)數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)由一組相關(guān)的對(duì)象組成,例如表、索引、視圖、存儲(chǔ)過(guò)程等。數(shù)據(jù)庫(kù)中的對(duì)象使用模式(Schema)進(jìn)行邏輯組織。準(zhǔn)確地說(shuō),一個(gè)數(shù)據(jù)庫(kù)由多個(gè)模式組成,模式由許多對(duì)象組成。

PostgreSQL 的邏輯存儲(chǔ)結(jié)構(gòu)如下圖所示:


多個(gè)數(shù)據(jù)庫(kù)之間是物理隔離的,每個(gè)數(shù)據(jù)庫(kù)在 PostgreSQL 中都對(duì)應(yīng)一個(gè)獨(dú)立的目錄,其中包含該數(shù)據(jù)庫(kù)的所有數(shù)據(jù)文件和元數(shù)據(jù)。客戶端連接服務(wù)器時(shí)需要指定數(shù)據(jù)庫(kù)名稱,連接到一個(gè)數(shù)據(jù)庫(kù)的客戶端無(wú)法查詢另一個(gè)數(shù)據(jù)庫(kù)中的數(shù)據(jù),除非使用外部數(shù)據(jù)封裝器(FDW)。

一個(gè)數(shù)據(jù)庫(kù)中的多個(gè)模式之間是邏輯隔離的,不同模式中可以存在同名的對(duì)象,例如 schema1 和 schema2 中都可以存在名為 test 的數(shù)據(jù)表。PostgreSQL 權(quán)限管理系統(tǒng)控制模式對(duì)象的訪問(wèn),訪問(wèn)對(duì)象時(shí)可以包含模式名稱,例如 schema1.test。

每個(gè)數(shù)據(jù)庫(kù)對(duì)象都有一個(gè)唯一的標(biāo)識(shí)符(OID),它是一個(gè)無(wú)符號(hào)的四字節(jié)整數(shù)。這些標(biāo)識(shí)符用于在系統(tǒng)表中唯一標(biāo)識(shí)不同的數(shù)據(jù)庫(kù)對(duì)象。例如,數(shù)據(jù)庫(kù)的 OID 存儲(chǔ)在 pg_database 表中,模式的 OID 存儲(chǔ)在 pg_namespace 表中,關(guān)系(表、索引、序列、視圖、復(fù)合類型等)的 OID 存儲(chǔ)在 pg_class 表中。通過(guò)這些標(biāo)識(shí)符,PostgreSQL 能夠在內(nèi)部有效地管理和引用各種數(shù)據(jù)庫(kù)對(duì)象。

存儲(chǔ)引擎

PostgreSQL 12 開(kāi)始支持插件式表訪問(wèn)方法(Table Access Method),基于這個(gè)接口可以實(shí)現(xiàn)不同的數(shù)據(jù)存儲(chǔ)引擎,針對(duì)特定的工作負(fù)載定制數(shù)據(jù)的存儲(chǔ)和檢索方式,從而提高系統(tǒng)的整體性能。

默認(rèn)的數(shù)據(jù)存儲(chǔ)引擎為 heap(堆表),使用參數(shù) default_table_access_method 進(jìn)行設(shè)置:

SHOW default_table_access_method;

default_table_access_method|
---------------------------+
heap ? ? ? ? ? ? ? ? ? ? ? |

用戶創(chuàng)建表或者物化視圖時(shí)可以指定存儲(chǔ)引擎,語(yǔ)法如下:

CREATE TABLE ...
USING method;

除了默認(rèn)的 heap 之外,已知正在開(kāi)發(fā)的存儲(chǔ)引擎包括 columnar 和 OrioleDB 等。

PostgreSQL 也支持插件式索引訪問(wèn)方法(Index Access Method),并且基于這個(gè)接口實(shí)現(xiàn)了 B-Tree、Hash、GiST、GIN 等不同的索引類型,同時(shí)用戶也可以擴(kuò)展自定義的索引類型,從而優(yōu)化不同場(chǎng)景下的查詢性能。


該文章在 2024/7/30 18:46:28 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
中文字幕免费无遮挡无删减 | 亚洲午夜主播在线网址 | 日本最强喷水少妇 | 日韩国产精品一区二区Hd | 久久午夜国产精品 | 中文字幕精品一区久久久久 |