溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

PG INDEX 創(chuàng)建并行的原理是什么

發(fā)布時間:2021-07-16 09:40:58 來源:億速云 閱讀:151 作者:chen 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“PG INDEX 創(chuàng)建并行的原理是什么”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

It's a long long story, 從 PG 8.3 引入了Heap-Only-Tuple, 主要的作用在用于減少更新所需的I/O數(shù)量,基于postgreql 的原理行的更新等于插入新的tuple,基于多版本控制MVCC, Postgres中的更新包括查找要更新的行,并將該行的新版本插入數(shù)據(jù)庫,引入的問題就是顯而易見的,索引,這就需要更多的I/O,數(shù)據(jù)要重新插入到表上的每個索引中。在插入的過程中需要先讀取每個相關(guān)的索引,新版本行的物理位置與舊版本的物理位置不同。那一個表中有的索引越多,更改的數(shù)據(jù)量越大,牽扯的索引的消耗就越大。

PG INDEX 創(chuàng)建并行的原理是什么

從上圖可以看,如果沒有HOT ,則索引頁面在更新后,需要另一個指針指向修改后的INDEX 數(shù)據(jù), 如果有了HOT 則不需要通過另外的指針 C 去指向修改后的索引,僅僅通過原有的指針,在原有的索引tuple1 上通過 t_cid來指向新的index的數(shù)據(jù)即可。在數(shù)據(jù)結(jié)構(gòu)中的樣子參看下圖

PG INDEX 創(chuàng)建并行的原理是什么

HOT的效率雖然高,但需要達到某些需求,才可以實現(xiàn),從上圖看

1  數(shù)據(jù)必須(tuple)必須在一個頁面

2  更新的數(shù)據(jù)中不能包含 INDEX 本身的數(shù)據(jù)

下面我們開始做相關(guān)的實驗,看看HOT 在實踐中是怎樣的

PG INDEX 創(chuàng)建并行的原理是什么

create table test (id int, name varchar(200), age float, datetime timestamp); 

insert into test select generate_series(1,10), random()*100, random()*1, now();  

create index idx_test_name on test (name);

create index idx_test_age on test (age);

create index idx_test_datetime on test (datetime);

通過 pageinspect 來對當(dāng)前的index 頁面進行一個細節(jié)觀測

PG INDEX 創(chuàng)建并行的原理是什么

1 測試1  將name 中的 ID =1  的值進行update 但更改的值和原來一樣

PG INDEX 創(chuàng)建并行的原理是什么

2  測試2 將datetime 中的 ID =1  的值進行update 到新的值,可以注意到,只要更新到有索引的字段,無論是那個,都會觸發(fā)所有的INDEX 的更新,圖中僅僅是更新了 id = 1 的 datetime值,但其他的索引也都進行了更新,10行變成 11行

PG INDEX 創(chuàng)建并行的原理是什么

我們對表test 繼續(xù)  vacuum 

PG INDEX 創(chuàng)建并行的原理是什么

可以從下圖看到垃圾的版本的index tuple 已經(jīng)被回收了  (部分截圖由于屏幕原因,并未截圖完全)

PG INDEX 創(chuàng)建并行的原理是什么

 為什么更改同樣的值的時候,索引不會被更新因為 PG11 時引入了 recheck_on_update 作為創(chuàng)建索引的默認(rèn)值,這樣索引會檢測UPDATE 時的值是否與現(xiàn)有的值不同,相同就不會觸發(fā)更新索引tuple的操作。

講到這里其實還沒有到 INDEX CONCURRENTLY  ,上面僅僅是粗略的介紹了HOT.

實際上索引并行建立,需要三個phase 

1  開始在系統(tǒng)的catalog聲明我們要開始建立新的索引,此時索引對于老的事務(wù)來說是不可見的,對于新的事務(wù)是可見的。

2 開始創(chuàng)建索引,通過對表的 MVCC 快照,對表中產(chǎn)生快照的 MVCC 中的可見行,開始建立建立索引。

3 當(dāng)?shù)诙絼?chuàng)建索引成功后,其實在此刻與上次MVCC的之間間隔,有插入UPDATE, DELETE的操作,這些是當(dāng)前新索引與當(dāng)前行的數(shù)據(jù)不一致的地方,此時會開始第二次MVCC ,在次MVCC做了快照,并修復(fù)新的索引后,后續(xù)就是開始維護索引,此時索引已經(jīng)可以正常的工作了。

但整體的并行的索引的創(chuàng)建工作并未結(jié)束,因為新的索引對于老的事務(wù)是不可見的,所以不能推出工作,所以必須等待比這個索引老的事務(wù)都結(jié)束了才能進行整體的索引可見和正常工作。

所以大事務(wù)和長時間運行的事務(wù),都是并行索引創(chuàng)建并盡快完成的阻礙,另外需要兩次 MVCC 所以一般來說 并行索引的創(chuàng)建的時間也就比一般非并行創(chuàng)建享有獨占鎖方式創(chuàng)建索引的時間要長。

“PG INDEX 創(chuàng)建并行的原理是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI