国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

PostgreSQL MVCC的弊端優(yōu)化方案

這篇具有很好參考價(jià)值的文章主要介紹了PostgreSQL MVCC的弊端優(yōu)化方案。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

我們之前的博客文章“我們最討厭的 PostgreSQL 部分”討論了大家最喜歡的 DBMS 多版本并發(fā)控制 (MVCC) 實(shí)現(xiàn)所帶來(lái)的問題。其中包括版本復(fù)制、表膨脹、索引維護(hù)和真空管理。本文將探討針對(duì)每個(gè)問題優(yōu)化 PostgreSQL 的方法。

盡管 PostgreSQL 的 MVCC 實(shí)現(xiàn)是 Oracle 和 MySQL 等其他廣泛使用的數(shù)據(jù)庫(kù)中最差的,但它仍然是我們最喜歡的 DBMS,而且我們?nèi)匀幌矚g它!通過分享我們的見解,我們希望幫助用戶釋放這個(gè)強(qiáng)大的數(shù)據(jù)庫(kù)系統(tǒng)的全部潛力。好消息是 OtterTune 會(huì)自動(dòng)為您解決許多此類問題(但不是全部?。?/p>

問題#1:版本復(fù)制

當(dāng)查詢修改元組時(shí),無(wú)論更新其一列還是所有列,PostgreSQL 都會(huì)通過復(fù)制其所有列來(lái)創(chuàng)建新版本。這種復(fù)制可能會(huì)導(dǎo)致大量數(shù)據(jù)重復(fù)并增加存儲(chǔ)需求,特別是對(duì)于具有許多列和較大行大小的表。

優(yōu)化:不幸的是,如果不對(duì) PostgreSQL 的內(nèi)部結(jié)構(gòu)進(jìn)行重大重寫(這會(huì)造成破壞),就沒有解決此問題的解決方法。這不像在情景喜劇中替換了一個(gè)沒有人注意到的角色。正如我們?cè)谏弦黄恼轮刑岬降?,EnterpriseDB 在 2013 年通過 zheap 項(xiàng)目開始了這條道路,但該項(xiàng)目的最后一次更新是在 2021 年。其他人已經(jīng)對(duì) PostgreSQL 代碼進(jìn)行了硬分叉,以取代其 MVCC 實(shí)現(xiàn)。著名的例子包括 OrioleDB 和 YugabyteDB。但對(duì)這些系統(tǒng)的更改永遠(yuǎn)不會(huì)合并回主 PostgreSQL 代碼庫(kù)。所以我們暫時(shí)只能使用 PostgreSQL 的append-only MVCC。

Problem #2: Table Bloat?問題#2:表膨脹

PostgreSQL 將過期版本(死元組)和活動(dòng)元組存儲(chǔ)在同一頁(yè)面上。盡管 PostgreSQL 的 autovacuum 工作程序最終會(huì)刪除這些死元組,但寫入繁重的工作負(fù)載可能會(huì)導(dǎo)致它們累積的速度快于真空處理的速度。此外,自動(dòng)清理僅刪除死元組以供重用(例如,存儲(chǔ)新版本),并且不會(huì)回收未使用的存儲(chǔ)空間。在查詢執(zhí)行期間,PostgreSQL 將死元組加載到內(nèi)存中(因?yàn)?DBMS 將它們與活元組混合在頁(yè)面上),從而增加磁盤 IO 并損害性能,因?yàn)?DBMS 檢索無(wú)用的數(shù)據(jù)。如果您正在運(yùn)行 Amazon 的 PostgreSQL Aurora,這將增加 DBMS 的 IOPS,并導(dǎo)致您給 Jeff Bezos(amazon的老板) 更多的錢!

優(yōu)化:我們建議監(jiān)控 PostgreSQL 的表膨脹,然后定期回收未使用的空間。 內(nèi)置pgstattuple模塊可以準(zhǔn)確計(jì)算數(shù)據(jù)庫(kù)中的可用空間,但它需要全表掃描,這對(duì)于生產(chǎn)環(huán)境中的大表來(lái)說不實(shí)用。

$ psql -c "CREATE EXTENSION pgstattuple" -d $DB_NAME
$ psql -c "SELECT * FROM pgstattuple('$TABLE_NAME')" -d $DB_NAME

或者,可以使用一次性查詢或腳本來(lái)估計(jì)表的未使用空間;它們比 pgstattuple 更快、更輕量,因?yàn)樗鼈兲峁┝吮砼蛎浀拇致怨烙?jì)。如果未使用的空間量很大,則 pg_repack 擴(kuò)展會(huì)從臃腫的表和索引中刪除并回收頁(yè)面。它在線工作,不需要在處理過程中對(duì)表進(jìn)行獨(dú)占鎖定(與?VACUUM FULL?不同)。

以下命令將把 pg_repack 擴(kuò)展安裝到自我管理的 DBMS 中(請(qǐng)參閱 Amazon 的 PostgreSQL RDS 說明),然后壓縮單個(gè)表。

$ psql -c "CREATE EXTENSION pg_repack" -d $DB_NAME
$ pg_repack -d $DB_NAME --table $TABLE_NAME

為了最大限度地減少對(duì)數(shù)據(jù)庫(kù)性能的潛在影響,OtterTune 建議我們的客戶在流量較低的非高峰時(shí)段啟動(dòng)此過程。

問題#3:二級(jí)索引維護(hù)

當(dāng)應(yīng)用程序?qū)Ρ韴?zhí)行?UPDATE?查詢時(shí),PostgreSQL 還必須更新該表的所有索引以將條目添加到新版本。這些索引更新增加了 DBMS 的內(nèi)存壓力和磁盤 I/O,特別是對(duì)于具有大量索引的表(一位 OtterTune 客戶在單個(gè)表上有 90 個(gè)索引?。kS著表中索引數(shù)量的增加,更新元組時(shí)產(chǎn)生的開銷也會(huì)增加。 PostgreSQL 避免更新僅堆元組 (HOT) 更新的索引,其中 DBMS 將新版本存儲(chǔ)在與先前版本相同的頁(yè)面上。但正如我們?cè)谏弦黄恼轮刑岬降模琌tterTune 客戶的 PostgreSQL 數(shù)據(jù)庫(kù)僅對(duì) 46% 的更新操作使用 HOT 優(yōu)化。

優(yōu)化:減少 PostgreSQL 索引寫入放大的明顯解決方法是減少每個(gè)表的索引數(shù)量。但這說起來(lái)容易做起來(lái)難。我們建議從表中重復(fù)和未使用的索引開始。人們可以通過檢查數(shù)據(jù)庫(kù)的模式來(lái)識(shí)別重復(fù)索引,以查看兩個(gè)索引是否以相同的順序引用相同的列并使用相同的數(shù)據(jù)結(jié)構(gòu)(例如,B+樹與哈希表)。對(duì)于未使用的索引,PostgreSQL 維護(hù)索引級(jí)指標(biāo)(例如,pg_stat_all_indexes.idx_scan),用于跟蹤在索引上啟動(dòng)的索引掃描的數(shù)量。如果索引的該值為零,則所有應(yīng)用程序的查詢都不會(huì)使用該索引。確保忽略未使用的主鍵或唯一索引,因?yàn)?DBMS 使用它們對(duì)表強(qiáng)制執(zhí)行完整性約束。

下面的屏幕截圖顯示了 OtterTune 的類似檢查,用于自動(dòng)查找不必要的索引。

PostgreSQL MVCC的弊端優(yōu)化方案,數(shù)據(jù)庫(kù),postgresql,數(shù)據(jù)庫(kù)

OtterTune’s Unused and Duplicate index dashboard.
OtterTune 的未使用和重復(fù)索引儀表板。

一旦確定要?jiǎng)h除的索引,下一步就是刪除它們。但是,如果您的應(yīng)用程序使用對(duì)象關(guān)系映射 (ORM) 框架來(lái)管理其數(shù)據(jù)庫(kù)架構(gòu),那么您不希望手動(dòng)刪除索引,因?yàn)?ORM 可能會(huì)在將來(lái)的架構(gòu)遷移期間重新創(chuàng)建索引。在這種情況下,有必要更新應(yīng)用程序代碼中的架構(gòu)。如果應(yīng)用程序未使用 ORM,則可以使用?DROP INDEX?命令。

問題#4:真空管理

PostgreSQL 的性能在很大程度上取決于其 autovacuum 清理過時(shí)數(shù)據(jù)和修剪 MVCC 方案中版本鏈的有效性。然而,由于其復(fù)雜性,配置自動(dòng)清理以正確運(yùn)行并及時(shí)刪除這些數(shù)據(jù)具有挑戰(zhàn)性。默認(rèn)的全局自動(dòng)清理設(shè)置不適合大型表(數(shù)百萬(wàn)到數(shù)十億的元組),因?yàn)橛|發(fā)清理可能需要很長(zhǎng)時(shí)間。此外,如果每個(gè) autovacuum 調(diào)用需要很長(zhǎng)時(shí)間才能完成或被長(zhǎng)時(shí)間運(yùn)行的事務(wù)阻塞,DBMS 將積累死元組并遭受陳舊統(tǒng)計(jì)數(shù)據(jù)的影響。將自動(dòng)清理延遲太久會(huì)導(dǎo)致查詢隨著時(shí)間的推移逐漸變慢,需要手動(dòng)干預(yù)來(lái)解決該問題。

優(yōu)化:雖然在 PostgreSQL 中清理表很痛苦,但好消息是它是可以管理的。但正如我們現(xiàn)在所討論的,這有很多步驟,并且需要跟蹤很多信息。

控制 autovacuum 的第一步是監(jiān)視每個(gè)表的死元組數(shù)量。 PostgreSQL 的 ?pg_stat_all_tables視圖提供了監(jiān)控表的基本指標(biāo),包括死元組 (?n_dead_tup?) 和活動(dòng)元組 (?n_live_tup?) 數(shù)量的估計(jì)。通過此類表級(jí)指標(biāo),您可以確定每個(gè)表過期元組的百分比,并確定哪些表需要額外的清理工作。

對(duì)于具有大量死元組的表,您可以調(diào)整其設(shè)置以使 PostgreSQL 更頻繁地觸發(fā) autovacuum。 PostgreSQL 允許您在表級(jí)別微調(diào) autovacuum 參數(shù),不同的表可能需要不同的最佳設(shè)置。最重要的旋鈕是 autovacuum_vacuum_scale_factor:它指定在 PostgreSQL 調(diào)用 autovacuum 之前表中必須存在的死元組的最小百分比。該旋鈕的默認(rèn)值為 20%。如果應(yīng)用程序的一個(gè)表有 10 億個(gè)元組,PostgreSQL 不會(huì)在該表上運(yùn)行清理,直到至少有 2 億個(gè)死元組。如果該表中的平均元組大小為 1KB,則 2 億個(gè)死元組將消耗 200GB 的磁盤存儲(chǔ)空間。這甚至不包括指向這些表的索引指針的額外存儲(chǔ)開銷!為了避免此問題,您應(yīng)該使用?ALTER TABLE?SQL 命令將大型表的比例因子旋鈕設(shè)置為小于 20%:

 ALTER TABLE table_name SET (autovacuum_ vacuum_scale_factor = 0.05);

接下來(lái),您應(yīng)該檢查 autovacuum 是否被長(zhǎng)時(shí)間運(yùn)行的事務(wù)阻塞。再次,我們可以依靠 PostgreSQL 的內(nèi)部遙測(cè)來(lái)獲取這些信息。 pg_stat_activity 視圖提供每個(gè) PostgreSQL 工作線程(即進(jìn)程)當(dāng)前執(zhí)行狀態(tài)的實(shí)時(shí)數(shù)據(jù)。它顯示每個(gè)活動(dòng)事務(wù)已運(yùn)行多長(zhǎng)時(shí)間。如果事務(wù)已經(jīng)運(yùn)行了幾個(gè)小時(shí),您應(yīng)該考慮將其終止,以便 autovacuum 可以完成其操作。下面的示例查詢查找所有運(yùn)行時(shí)間超過五分鐘的事務(wù):

SELECT pid, NOW() - xact_start AS duration, query, state
  FROM pg_stat_activity
 WHERE (NOW() - xact_start) > INTERVAL '5 minutes';

然后,您可以使用 pg_cancel_backend 管理函數(shù)終止查詢:

SELECT pg_cancel_backend($PID_TO_KILL);

當(dāng)然,在街上刪除查詢可能會(huì)產(chǎn)生意想不到的后果,因此您必須確保殺死它們不會(huì)在您的應(yīng)用程序中造成問題。為了避免將來(lái)出現(xiàn)同樣的問題,請(qǐng)確保事務(wù)的查詢不必要地運(yùn)行更長(zhǎng)的時(shí)間,因?yàn)樗鼈兪褂玫氖堑托У牟樵冇?jì)劃。請(qǐng)參閱我們之前關(guān)于優(yōu)化查詢性能的文章,例如欺騙?ORDER BY...LIMIT?和運(yùn)行?ANALYZE?,了解如何使用 OtterTune 改善慢速查詢。如果您不需要它們是原子的,您還可以重構(gòu)您的應(yīng)用程序,將大型事務(wù)分解為較小的工作單元(但不可否認(rèn),這并不總是容易做到)。

最后,您需要查看是否存在長(zhǎng)時(shí)間運(yùn)行的真空過程,然后調(diào)整其他旋鈕。與 pg_stat_activity 顯示 PostgreSQL 工作線程的狀態(tài)類似,pg_stat_progress_vacuum 視圖顯示活動(dòng) autovacuum 操作的狀態(tài)。通過此視圖,您可以確定真空是否需要幾個(gè)小時(shí)甚至幾天才能完成。如果您的 PostgreSQL DBMS 確實(shí)有長(zhǎng)時(shí)間運(yùn)行的 Vacuum,那么 OtterTune 建議調(diào)整三個(gè)旋鈕:

  1. autovacuum_work_mem 參數(shù)指定 DBMS 在每次 autovacuum 調(diào)用中可以使用的最大內(nèi)存量。增加此參數(shù)可以加快清理速度,因?yàn)樗梢栽诿看握{(diào)用時(shí)修剪更多的死元組。
  2. autovacuum_vacuum_cost_limit 參數(shù)控制在 PostgreSQL 強(qiáng)制自動(dòng)清理工作者暫時(shí)退出之前可以產(chǎn)生多少 I/O 活動(dòng)自動(dòng)清理工作者。該旋鈕的值越高意味著自動(dòng)清理將更加積極。
  3. 與這種基于成本的控制機(jī)制相關(guān),autovacuum_vacuum_cost_delay? 參數(shù)確定 autovacuum 工作線程在 DBMS 強(qiáng)制其退出后必須等待多長(zhǎng)時(shí)間。較短的延遲意味著自動(dòng)清理每次都會(huì)更快地恢復(fù)操作。

原文地址文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-579990.html

到了這里,關(guān)于PostgreSQL MVCC的弊端優(yōu)化方案的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【性能優(yōu)化】MySql數(shù)據(jù)庫(kù)查詢優(yōu)化方案

    【性能優(yōu)化】MySql數(shù)據(jù)庫(kù)查詢優(yōu)化方案

    了解系統(tǒng)運(yùn)行效率提升的整體解決思路和方向 學(xué)會(huì)MySQl中進(jìn)行數(shù)據(jù)庫(kù)查詢優(yōu)化的步驟 學(xué)會(huì)看慢查詢、執(zhí)行計(jì)劃、進(jìn)行性能分析、調(diào)優(yōu) ?關(guān)于這個(gè)問題,我們通常首先考慮的是硬件升級(jí),畢竟服務(wù)器的內(nèi)存、CPU、磁盤IO速度 、網(wǎng)絡(luò)速度等都是制約我們系統(tǒng)快慢的首要因素。硬

    2024年02月03日
    瀏覽(27)
  • 數(shù)據(jù)庫(kù)大數(shù)據(jù)量的優(yōu)化方案

    數(shù)據(jù)庫(kù)大數(shù)據(jù)量的優(yōu)化方案

    在系統(tǒng)開發(fā)的初期以及使用的初期,一般不會(huì)太過于在意數(shù)據(jù)庫(kù)的設(shè)計(jì)以及sql語(yǔ)句的優(yōu)化,這就會(huì)導(dǎo)致系統(tǒng)有可能在日積月累的海量數(shù)據(jù)下越來(lái)越慢直至崩潰,所以以后在系統(tǒng) 數(shù)據(jù)庫(kù)設(shè)計(jì)之初完備的數(shù)據(jù)庫(kù)模型的設(shè)計(jì)是必須的。 對(duì)于數(shù)據(jù)庫(kù)的的優(yōu)化此處給出三種優(yōu)化方案:

    2024年02月02日
    瀏覽(12)
  • MVCC-數(shù)據(jù)庫(kù)

    MVCC-數(shù)據(jù)庫(kù)

    事務(wù),由一個(gè)有限的數(shù)據(jù)庫(kù)操作序列構(gòu)成,這些操作要么全部執(zhí)行,要么全部不執(zhí)行,是一個(gè)不可分割的工作單位。 假如A轉(zhuǎn)賬給B 100 元,先從A的賬戶里扣除 100 元,再在 B 的賬戶上加上 100 元。如果扣完A的100元后,還沒來(lái)得及給B加上,銀行系統(tǒng)異常了,最后導(dǎo)致A的余額減少

    2024年02月06日
    瀏覽(23)
  • mysql數(shù)據(jù)庫(kù) mvcc

    mysql數(shù)據(jù)庫(kù) mvcc

    ? 在看MVCC之前我們先補(bǔ)充些基礎(chǔ)內(nèi)容,首先來(lái)看下事務(wù)的ACID和數(shù)據(jù)的總體運(yùn)行流程 ? ?數(shù)據(jù)庫(kù)整體的使用流程: ACID流程圖? mysql核心日志: 在MySQL數(shù)據(jù)庫(kù)中有三個(gè)非常重要的日志binlog,undolog,redolog. mvcc概念介紹: MVCC (Multi-Version Concurrency Control): 多版本并發(fā)控制,是一種并發(fā)

    2024年02月20日
    瀏覽(26)
  • 【數(shù)據(jù)庫(kù)】聊聊MVCC機(jī)制與BufferPool緩存機(jī)制

    【數(shù)據(jù)庫(kù)】聊聊MVCC機(jī)制與BufferPool緩存機(jī)制

    上一篇文章,介紹了隔離級(jí)別,MySQL默認(rèn)是使用可重復(fù)讀,但是在可重復(fù)讀的級(jí)別下,可能會(huì)出現(xiàn)幻讀,也就是讀取到另一個(gè)session添加的數(shù)據(jù),那么除了配合使用間隙鎖的方式,還使用了MVCC機(jī)制解決,保證在可重復(fù)讀的場(chǎng)景下,同一個(gè)session讀取的數(shù)據(jù)一致性。 MVCC(Multi-Vers

    2024年01月20日
    瀏覽(20)
  • 深入解析MVCC:多版本并發(fā)控制的數(shù)據(jù)庫(kù)之道

    目錄 引言 一、什么是MVCC? 二、MVCC的實(shí)現(xiàn)原理 2.1版本號(hào) 2.1.1版本號(hào)的作用: 2.1.2版本號(hào)的組成: 2.1.3.示例 2.2事務(wù)id 2.2.1事務(wù)ID的作用: 2.2.2事務(wù)ID的生成: 2.2.3示例: 2.3 快照(Snapshot) 2.3.1快照的作用: 2.3.2快照的實(shí)現(xiàn)方式: 2.3.3示例: 2.4版本鏈(Version Chain) 2.4.1版本鏈

    2024年01月24日
    瀏覽(28)
  • java八股文面試[數(shù)據(jù)庫(kù)]——可重復(fù)讀怎么實(shí)現(xiàn)的(MVCC)

    java八股文面試[數(shù)據(jù)庫(kù)]——可重復(fù)讀怎么實(shí)現(xiàn)的(MVCC)

    可重復(fù)讀(repeatable read)定義: 一個(gè)事務(wù)執(zhí)行過程中看到的數(shù)據(jù),總是 跟這個(gè)事務(wù) 在 啟動(dòng)時(shí) 看到的數(shù)據(jù)是一致的。 MVCC MVCC, 多版本并發(fā)控制 , 用于實(shí)現(xiàn) 讀已提交 和 可重復(fù)讀 隔離級(jí)別。 MVCC的核心就是 Undo log多版本鏈 + Read view ,“MV”就是通過 Undo log來(lái)保存數(shù)據(jù)的歷史版

    2024年02月09日
    瀏覽(100)
  • postgresql|數(shù)據(jù)庫(kù)|MySQL數(shù)據(jù)庫(kù)向postgresql數(shù)據(jù)庫(kù)遷移的工具pgloader的部署和初步使用

    postgresql|數(shù)據(jù)庫(kù)|MySQL數(shù)據(jù)庫(kù)向postgresql數(shù)據(jù)庫(kù)遷移的工具pgloader的部署和初步使用

    MySQL數(shù)據(jù)庫(kù)和postgresql數(shù)據(jù)庫(kù)之間的差異并不多,這里的差異指的是對(duì)SQL語(yǔ)言的支持兩者并不大,但底層的東西差異是非常多的,例如,MySQL的innodb引擎概念,數(shù)據(jù)庫(kù)用戶管理,這些和postgresql相比是完全不同的(MySQL用戶就是用戶,沒有角色,postgresql有用戶,有角色,但差異不

    2024年02月14日
    瀏覽(36)
  • 【數(shù)據(jù)庫(kù)】什么是 PostgreSQL?開源數(shù)據(jù)庫(kù)系統(tǒng)

    【數(shù)據(jù)庫(kù)】什么是 PostgreSQL?開源數(shù)據(jù)庫(kù)系統(tǒng)

    PostgreSQL 是一個(gè)開源的對(duì)象關(guān)系數(shù)據(jù)庫(kù)系統(tǒng),本文,我們將討論 PostgreSQL、它的用途和好處。 PostgreSQL 是由 PostgreSQL Global Development Group 開發(fā)的高級(jí) 開源關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS) 。它作為 POSTGRES 項(xiàng)目的一部分于 1986 年在加州大學(xué)伯克利分校啟動(dòng),它最初于 1996 年 7 月 8 日發(fā)布

    2023年04月08日
    瀏覽(32)
  • postgresql數(shù)據(jù)庫(kù)定時(shí)備份到遠(yuǎn)程數(shù)據(jù)庫(kù)

    postgresql數(shù)據(jù)庫(kù)定時(shí)備份到遠(yuǎn)程數(shù)據(jù)庫(kù)

    1.老規(guī)矩,服務(wù)器目錄結(jié)構(gòu): conf目錄無(wú)內(nèi)容 profile: 其中: 最后一行 export PGPASSWORD=‘root’ 是需要備份的數(shù)據(jù)庫(kù)的密碼,因?yàn)橹苯佑?pg_dump 命令備份需要輸入密碼交互,而我們需要達(dá)到自動(dòng)備份,所以借助這種方式不需要輸入密碼 docker-compose.yml: 啟動(dòng)容器: 然后再data目錄下面

    2024年02月09日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包