五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

PostgreSQL從小白到專家 - 第23講:緩沖區(qū)管理器

2023-07-20 17:16 作者:北京CUUG  | 我要投稿



PostgreSQL從小白到專家,是從入門逐漸能力提升的一個系列教程,內(nèi)容包括對PG基礎(chǔ)的認知、包括安裝使用、包括角色權(quán)限、包括維護管理、、等內(nèi)容,希望對熱愛PG、學習PG的同學們有幫助,歡迎持續(xù)關(guān)注CUUG PG技術(shù)大講堂。

第23講:緩沖區(qū)管理器

內(nèi)容1 : 緩沖區(qū)概述

內(nèi)容2 : 緩沖區(qū)管理器結(jié)構(gòu)

內(nèi)容3 : 緩沖區(qū)管理器鎖

內(nèi)容4 : 緩沖區(qū)管理器如何工作

內(nèi)容5 : 環(huán)形緩沖區(qū)

內(nèi)容6 : 臟塊寫


緩沖區(qū)概述

· 緩沖區(qū)結(jié)構(gòu)(存放各種類型的數(shù)據(jù)塊)

? ? 數(shù)據(jù)文件頁—表和索引塊

? ? 可用空間地圖塊

? ? 可見性地圖塊

? ? 緩沖區(qū)數(shù)組索引--buffer_ids

· Buffer Tag結(jié)構(gòu)

? ? RelFileNode (分別為表對象oid、數(shù)據(jù)庫oid、表空間oid)

? ? 頁面的fork number (分別為0、1、2)

? ? 頁面number 示例:

? ? 緩沖區(qū)標記{(16821、16384、37721)、0、7}

? ? 1、標識第七個塊中的頁

? ? 2、其關(guān)系的OID和fork號分別為37721和0(0即為存放表數(shù)據(jù)的文件)

? ? 3、該塊存放在OID為16384的數(shù)據(jù)庫中,表空間的OID為16821

· Backend進程讀數(shù)據(jù)塊到緩沖區(qū)

· 寫臟塊

? ? 下面進程工作時會導致臟塊寫:

? ? · Checkpointer

? ? · background writer


緩沖區(qū)管理器結(jié)構(gòu)

· 管理器結(jié)構(gòu)

· 第一層(Buffer Table)

? ? 在這一層內(nèi)置的hash函數(shù)將buffer_tags映射到插槽,插槽中記錄了buffer_tags和描述層的buffer_id的映射關(guān)系。

· 第二層(Buffer Descriptor)

? ? 描述層包含了很多重要的信息,包括buffer_tag與緩沖池插槽id的映射關(guān)系,訪問次數(shù)統(tǒng)計,鎖等信息。

? ? · Tag

? ???· buffer_id

? ???· refcount (被進程訪問過一次加一,被時鐘掃描過后減一,為零時可用)

? ???· usage_count

? ???· context_lock and io_in_progress_lock

? ???· Flags

? ???dirty bit

?? ?????? ???valid bit

? ??? ???io_in_progress bit

? ???· freeNext

· Buffer Descriptors Layer (Loading the first page)

? ? 先請求一個緩沖區(qū)空間,buffer table層把描述層的buffer_id與buffer_tag進行映射;然后在描述層把buffer_tag與緩沖區(qū)id進行映射;最后把數(shù)據(jù)塊讀到相應(yīng)的緩沖區(qū)槽中。

· 第三層(Buffer Pool)

? ? 緩沖池是存儲數(shù)據(jù)文件頁(如表和索引)的簡單數(shù)組。緩沖池數(shù)組的索引稱為buffer_ids。

? ? 緩沖池被分割成大小為8 KB的插槽,等于頁面大小。因此,每個槽可以存儲整個頁面。緩沖區(qū)管理器鎖

· Buffer Manager Locks

? ? 緩沖區(qū)管理器為許多不同的目的使用許多鎖

? ? 鎖是緩沖區(qū)管理器同步機制的一部分;它們與任何SQL語句和SQL選項都不相關(guān)

· Buffer Table 層的鎖

? ? BufMappingLock保護整個緩沖表的數(shù)據(jù)完整性。它是一個輕量鎖,可以在共享和獨占模式下使用。在緩沖區(qū)表中搜索條目時,后端進程保存共享的BufMappingLock。當插入或刪除條目時,后端進程持有獨占鎖。

· Buffer Descriptor 層鎖

? ? 每個緩沖區(qū)描述符使用兩個輕量級鎖

? ?? ???· content_lock

? ?? ???· io_in_progress_lock

· content_lock

content_lock是一種典型的強制訪問限制的鎖。它可以用于共享和獨占模式。

當執(zhí)行下列操作之一時,將獲取獨占內(nèi)容鎖:

· dml操作

· 物理刪除元組或壓縮存儲頁上的可用空間(vacuum和HOT處理)

· 凍結(jié)存儲頁中的元組

· io_in_progress_lock

? ? io_in_progress鎖用于等待緩沖區(qū)上的I/O完成。當PostgreSQL進程從存儲器加載/寫入頁面數(shù)據(jù)時,該進程在訪問存儲器時持有相應(yīng)描述符的獨占io_in_progress鎖。

· spinlock

? ? 下面顯示如何固定緩沖區(qū)描述符:

? ? 1、獲取緩沖區(qū)描述符的自旋鎖。

? ? 2、將其refcount和usage_count的值增加1。

? ? 3、松開旋轉(zhuǎn)鎖。

? ? 下面顯示如何將臟位設(shè)置為“1”:

? ? 1、獲取緩沖區(qū)描述符的自旋鎖。

? ? 2、使用按位操作將臟位設(shè)置為“1”。

? ? 3、松開旋轉(zhuǎn)鎖。


緩沖區(qū)管理器如何工作

· 訪問已存放在緩沖區(qū)中的數(shù)據(jù)塊

· 加載數(shù)據(jù)塊到空的緩沖池插槽

· 加載數(shù)據(jù)塊到一個需要釋放的緩沖池插槽

· 緩沖區(qū)塊替換機制

? ? 替換頁面算法

? ??? ??· 時鐘掃描(8.1開始及以后的版本)

? ??? ??· LRU算法(8.1以前的版本)

· 時鐘掃描算法

? ? 緩沖區(qū)描述符顯示為藍色或青色框,框中的數(shù)字顯示每個描述符的使用計數(shù),每掃描一次則減一,緩沖區(qū)每被訪問過一次則加一。


Ring Buffer

· Ring Buffer

· Bulk-reading

? ? 需要大塊的緩沖池時,如果掃描緩沖池時其大小超過(共享緩沖區(qū)/4)四分之一的空間時,還沒有找到足夠的緩沖池,則分配256KB環(huán)形緩沖區(qū)。

· Bulk-writing

? ? 執(zhí)行下面列出的SQL命令時。在這種情況下,環(huán)緩沖區(qū)大小為16MB。

? ??? ??COPY FROM command.

? ??? ??CREATE TABLE AS command.

? ??? ??CREATE MATERIALIZED VIEW or REFRESH MATERIALIZED VIEW command.

? ??? ??ALTER TABLE command.

· Vacuum-processing

? ? 當自動真空機進行真空處理時。在這種情況下,環(huán)緩沖區(qū)大小為256 KB。


臟塊寫

· Flushing Dirty Pages

? ? 檢查點進程和后臺寫入進程將臟頁刷新到存儲區(qū),檢查點與后臺寫進程分離。

? ? 檢查點進程將檢查點記錄寫入WAL段文件,并在檢查點啟動時刷新臟頁。

? ? 后臺寫進程的作用是減少檢查點密集寫的影響。后臺寫進程持續(xù)一點一點地刷新臟頁,對數(shù)據(jù)庫活動的影響最小。

? ? 默認情況下,后臺寫入程序每200毫秒喚醒一次(由bgwriter_delay定義),并最多刷新為100頁(由bgwriter_lru_maxpages 定義)


共享池緩沖區(qū)參數(shù)設(shè)置

· 共享緩沖區(qū)相關(guān)參數(shù)

? ? shared_buffers參數(shù)設(shè)置 show shared_buffers;

? ? Alter system set shared_buffers=256M;

? ? wal_buffers參數(shù)設(shè)置 show wal_buffers;

? ? Alter system set wal_buffers =4M;

? ? effective_cache_size 參數(shù)設(shè)置 show effective_cache_size;

? ? 提供可用于磁盤高速緩存的內(nèi)存量的估計值。它只是一個建議值,而不是確切分配的內(nèi)存或緩存大小。它不會實際分配內(nèi)存,而是會告知優(yōu)化器內(nèi)核中可用的緩存量。在一個索引的代價估計中,更高的數(shù)值會使得索引掃描更可能被使用,更低的數(shù)值會使得順序掃描更可能被使用。在設(shè)置這個參數(shù)時,還應(yīng)該考慮PostgreSQL的共享緩沖區(qū)以及將被用于PostgreSQL數(shù)據(jù)文件的內(nèi)核磁盤緩沖區(qū)。默認值是4GB。




以上就是【PostgreSQL從小白到專家】第23講 - 緩沖區(qū)管理? 的內(nèi)容,歡迎一起探討交流釘釘交流群:35,82,24,60,往期視頻及文檔內(nèi)容聯(lián)系CUUG


PostgreSQL從小白到專家 - 第23講:緩沖區(qū)管理器的評論 (共 條)

分享到微博請遵守國家法律
舒兰市| 新闻| 康平县| 乐平市| 左云县| 新干县| 日喀则市| 义马市| 富平县| 保德县| 渑池县| 绥德县| 普定县| 泾川县| 延边| 乌苏市| 枣强县| 宁河县| 万荣县| 高阳县| 峨山| 屯门区| 定结县| 泸水县| 山丹县| 波密县| 丰原市| 宜黄县| 乐清市| 兰西县| 宁波市| 巴林左旗| 元朗区| 福泉市| 台前县| 兴安盟| 湟源县| 信宜市| 霍林郭勒市| 泰宁县| 寿光市|