在线观看 国产-在线高清一级欧美精品-在线高清国产-在线福利视频-久久观看视频-久久观看

下載吧 - 綠色安全的游戲和軟件下載中心

軟件下載吧

當前位置:軟件下載吧 > 技術開發 > 數據庫 > PostgreSQL HOT與PHOT有哪些區別

PostgreSQL HOT與PHOT有哪些區別

時間:2024-02-09 10:40作者:下載吧人氣:24

1、HOT概述

PostgreSQL中,由于其多版本的特性,當我們進行數據更新時,實際上并不是直接修改元數據,而是通過新插入一行數據來進行間接的更新。而當表上存在索引時,由于新插入了數據,那么索引必然也需要同步進行更新,這在索引較多的情況下,對于更新的性能影響必然很大。

為了解決這一問題,pg從8.3版本開始就引入了HOT(Heap Only Tuple)機制。其原理大致為,當更新的不是索引字段時,我們通過將舊元組指向新元組,而原先的索引不變,仍然指向舊元組,但是我們可以通過舊元組作為間接去訪問到新的元組,這樣就不用再去更新索引了。

2、HOT實現技術細節

要使用HOT進行更新,需要滿足兩個前提:

  • 新的元組和舊元組必須在同一個page中;
  • 索引字段不能進行更新。

當我們進行HOT更新時,首先是分別設置舊元組的t_informask2標志位為HEAP_HOT_UPDATED和新元組為HEAP_ONLY_TUPLE。

更新如下圖所示:

PostgreSQL HOT與PHOT有哪些區別

我們更新tuple1為tuple2,分別設置這兩行元組的t_informask2標志位,然后tuple1的ctid指向tuple2,而tuple2指向自己。

但是這樣存在一個明顯的問題,我們都知道pg會定期進行vacuum清理那些死元組,那么我們這里如果通過tuple1去訪問tuple2的話,tuple1這個死元組被清理了又該怎么辦呢?

PostgreSQL HOT與PHOT有哪些區別

所以pg會在合適的時機進行行指針的重定向,將舊元組的行指針指向新元組的行指針,這一過程稱為修剪。于是在修剪之后,我們通過HOT機制訪問數據便成了這樣:

1、通過索引元組找到舊元組的行指針1;

2、通過重定向的行指針1找到行指針2;

3、通過行指針2找到新元組tuple2。

這樣即使舊元組tuple1被清理掉也沒有影響了。

HOT對應的wal日志實現:

對于HOT的update操作,其wal日志中記錄的信息主要是由xl_heap_update結構存儲。

PostgreSQL HOT與PHOT有哪些區別

如果新的元組存儲在 block_id 為 0 的塊上,如果不是 XLOG_HEAP_HOT_UPDATE,那么舊的元組將會存儲在 block_id 為 1 的塊上。反之如果block_id 為 1 的塊沒有被使用,那么則認為是 XLOG_HEAP_HOT_UPDATE。

3、何時進行修剪

前面我們提到了,舊行的行指針會重定向到新行的行指針,這一過程稱之為修剪。那么什么時候會發生修剪呢?

一般來說,當我們執行select、update、insert、delete這些命令時均有可能觸發修剪,其觸發機制大致有兩種情況:

  • 上一次進行update時無法在本page找到足夠的空間;
  • 當前page上剩余空間小于fill-factor的值,最多小于10%

PostgreSQL HOT與PHOT有哪些區別

除此之外,當進行修剪時,還會選擇合適的時機進行死元組的清理,這一操作稱為碎片整理。碎片整理發生在當我們對元組進行檢索時發現空閑空間少于10%時,和修剪不同的是,碎片整理不會發生在insert時,因為該操作并不會檢索行。

相較于普通的vacuum操作,碎片清理并不涉及索引元組的清理,開銷相對于常規的清理要小很多,是通過PageRepairFragmentation函數來實現的。

這也是為什么HOT要求新舊元組需要在同一個page中,雖然從理論上來說我們可以將行指針的鏈表指向不同page,但是這樣我們便不能使用page-local的操作來進行碎片清理了。

4、HOT的不足

前面我們提到了HOT的前提條件之一就是:更新的列不能是索引列。需要注意,當更新的列是索引列時并不僅僅是會修改該列上的索引,整張表上所有的索引均會被修改。

例子:

創建測試表:

bill=# create table a(id int, c1 int, c2 int, c3 int);
CREATE TABLE
bill=# insert into a select generate_series(1,10), random()*100, random()*100, random()*100;
INSERT 0 10
bill=# create index idx_a_1 on a (id);
CREATE INDEX
bill=# create index idx_a_2 on a (c1);
CREATE INDEX
bill=# create index idx_a_3 on a (c2);
CREATE INDEX
標簽[db:關鍵字]

相關下載

查看所有評論+

網友評論

網友
您的評論需要經過審核才能顯示

熱門閱覽

最新排行

公眾號

主站蜘蛛池模板: 免费视频毛片 | 四虎影视久久久免费 | 亚洲欧美精品网站在线观看 | 国产精品久久久一区二区三区 | 五月丁香六月综合av | 亚洲永久免费视频 | 亚洲国产乱 | 亚洲国产综合自在线另类 | 五月综合色婷婷影院在线观看 | 春色丁香 | 欧美日韩亚洲国产一区二区三区 | 成人羞羞视频免费 | 久热国产视频 | 日本三级成人中文字幕乱码 | 国产精品视频免费看 | 亚州综人网 | 四虎影视永久地址 | 在线看国产视频 | 欧美成人猛男性色生活 | 中文字幕在线不卡精品视频99 | 日本高清无卡码一区二区久久 | 国内精品久久久久久久久蜜桃 | 婷婷激情五月 | 日本欧美在线视频 | 日韩欧美亚洲国产一区二区三区 | 久免费视频 | 亚洲日韩欧美一区二区在线 | 一区二区三区视频 | 国产成人精品亚洲日本在线 | 亚洲欧美日本国产一区二区三区 | 羞羞动漫在线免费观看 | 亚洲wwwwww | 国产片欧美片亚洲片久久综合 | 九九在线| 五月一区二区久久综合天堂 | 亚洲一二三四区 | 国产精品亚洲一区二区三区久久 | 热久在线 | 欧美高清一区 | 五月天婷婷丁香 | 一区二区三区四区在线不卡高清 |