亚洲乱色熟女一区二区三区丝袜,天堂√中文最新版在线,亚洲精品乱码久久久久久蜜桃图片,香蕉久久久久久av成人,欧美丰满熟妇bbb久久久

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

后臺寫進(jìn)程

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

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

檢查點進(jìn)程

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

以下情況都會觸發(fā)檢查點操作:

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

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

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

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

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

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

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

自動清理啟動進(jìn)程負(fù)責(zé)定期調(diào)用工作進(jìn)程執(zhí)行清理流程(VACUUM 以及 ANALYZE),默認(rèn)情況下每隔 1 分鐘(autovacuum_naptime)運行一次,每次最多調(diào)用 3 個(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ù)時的磁盤寫入瓶頸。

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

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

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

歸檔進(jìn)程

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

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

日志收集進(jìn)程

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

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

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

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

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

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

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

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

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

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

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ù)提交時都會寫入磁盤,因此過大的值并不會帶來顯著的性能提升。不過,對于大量并發(fā)的寫入操作,適當(dāng)增加該參數(shù)的值可以提高系統(tǒng)的性能。

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

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

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

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

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

工作內(nèi)存用于查詢處理過程中的數(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í)行,而不需要使用磁盤存儲臨時結(jié)果。對于復(fù)雜的查詢,可能會執(zhí)行并發(fā)的排序或者哈希操作,每個操作都可以最多使用該參數(shù)設(shè)置的內(nèi)存。另外,多個會話可能同時執(zhí)行排序操作。因此,排序占用的總內(nèi)存可能是 work_mem 的許多倍;work_mem 的值不能設(shè)置的過高,因為它可能導(dǎo)致內(nèi)存使用瓶頸。

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

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

臨時緩沖用于存儲臨時表數(shù)據(jù)。每個會話都可以使用單獨的臨時緩沖來存儲臨時表的數(shù)據(jù),以提高訪問效率。

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

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

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

物理存儲

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

SHOW data_directory;

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

根目錄包含多個子目錄和文件:

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

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

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

其中,base 子目錄存儲了每個數(shù)據(jù)庫的數(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

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

select oid, datname
from pg_database;

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

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

SELECT pg_relation_filepath('public.animal');

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

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

表空間

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

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

表空間的引入為 PostgreSQL 的管理帶來了以下好處:

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

  • 管理員可以根據(jù)數(shù)據(jù)庫對象的使用統(tǒng)計優(yōu)化系統(tǒng)的性能。例如,可以將訪問頻繁的索引存放到一個非??焖偾铱煽康拇疟P上,比如昂貴的固態(tài)硬盤。與此同時,將很少使用或者對性能要求不高的歸檔數(shù)據(jù)表存儲到廉價的低速磁盤上。

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

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

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

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

CREATE TABLE ...
TABLESPACE ts_name;

邏輯存儲

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

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


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

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

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

存儲引擎

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

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

SHOW default_table_access_method;

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

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

CREATE TABLE ...
USING method;

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

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


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