新聞中心
這篇文章將為大家詳細(xì)講解有關(guān)PostgreSQL數(shù)據(jù)讀取快慢怎么辦,小編覺得挺實(shí)用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、重慶小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了城北免費(fèi)建站歡迎大家使用!
PostgreSQL使用shared_buffers來緩存內(nèi)存中的塊。其思想是減少磁盤I/O并以最有效的方式加速數(shù)據(jù)庫。在正常操作期間,數(shù)據(jù)庫緩存將非常有用,并確保良好的響應(yīng)時間。但是,如果由于某種原因重新啟動數(shù)據(jù)庫實(shí)例,會發(fā)生什么情況呢?你的PostgreSQL數(shù)據(jù)庫性能將受到影響,直到你的I/O緩存再次填滿。這需要一些時間,而且可能會嚴(yán)重影響查詢響應(yīng)時間。
在PostgreSQL 11中,一個新的autoprewarm功能被添加到contrib模塊pg_prewarm中。這將使用在最后一次服務(wù)器重新啟動之前持有的相同頁面自動溫暖共享緩沖區(qū)。為了實(shí)現(xiàn)這一點(diǎn),Postgres現(xiàn)在有一個后臺工作程序來定期記錄文件中共享緩沖區(qū)的內(nèi)容——“autoprewarm.blocks”。接下來,它將在服務(wù)器重啟后重新加載這些頁面。
PostgreSQL可以通過 pg_prewarm 的方式來提供預(yù)熱緩沖的作用,pg_prewam 提供兩種功能,手動緩沖和自動緩沖。
如何安裝pg_prewarm及autoprewarm,以下基于pg 11 版本,在PG11中如果你編譯安裝則默認(rèn)的pg_prewarm 會被安裝到PG 中,確切地說,“autoprewarm master”將定期在文件“$PGDATA/autoprewarm.blocks”中記錄共享緩沖區(qū)中的頁面信息。更新“autoprewarm”的頻率。塊”由配置參數(shù)pg_prewarm_autoprewarm_interval決定。一旦服務(wù)器重新啟動,主服務(wù)器將讀取“autoprewarm”。塊”,并排序要預(yù)熱的頁面列表。接下來,它將每次為每個數(shù)據(jù)庫啟動一個worker。然后,每個數(shù)據(jù)庫工作程序(即autoprewarm工作程序)將加載屬于其數(shù)據(jù)庫的頁面。
安裝只需要兩步
1 需要在 shared_preload_libraries 中添加
當(dāng)然你也可以執(zhí)行下面的命令
alter system set shared_preload_libraries = 'pg_prewarm';
從啟動服務(wù)器后,可以看到 autoprewarm master 的這個線程
并且在數(shù)據(jù)目錄可以看到新生成的文件
2 在你的數(shù)據(jù)庫中執(zhí)行(與預(yù)熱無關(guān))
create extension pg_prewarm;
裝載你的擴(kuò)展
在做完這些我們做一個測試,我們在打開的預(yù)熱的機(jī)器上,進(jìn)行分析查詢
可以看到第二次已經(jīng)走 cache了
我們關(guān)閉postgresql 再從重啟動PG ,再次運(yùn)行,看到圖中查詢已經(jīng)走了cache
如果我們關(guān)閉數(shù)據(jù)庫,在關(guān)閉期間將autoprewarm.blocks刪除后,在重新啟動PG 我們看看結(jié)果如何
很明確的看到查詢中沒有走緩沖。
那文件到底存儲了什么
第一行表示頁面的總數(shù),后面的每一行表示關(guān)于頁面的信息。每個頁面都由數(shù)據(jù)庫oid、表空間oid、關(guān)系的relfilenode、fork文件號和塊號惟一地表示。
我們可以看一下系統(tǒng)中的 pg_prewarm函數(shù),在PG 中國函數(shù)是使用C語言撰寫的,當(dāng)然如果用C語言來寫 PG 的函數(shù),效率是很高的。
CREATE OR REPLACE FUNCTION public.pg_prewarm(
regclass,
mode text DEFAULT 'buffer'::text,
fork text DEFAULT 'main'::text,
first_block bigint DEFAULT NULL::bigint,
last_block bigint DEFAULT NULL::bigint)
RETURNS bigint
LANGUAGE 'c'
COST 1
VOLATILE PARALLEL SAFE
AS '$libdir/pg_prewarm', 'pg_prewarm'
;
其中會將四個參數(shù)傳遞給函數(shù) 1 將prewarm表名傳遞,2 prewarm 的模式 3第三個參數(shù)表的fork類型,最后最后兩個是開始和結(jié)束的block number
我們會進(jìn)行以下測試,看在不同的模式下,如果數(shù)據(jù)上送到緩沖中的速度的提升,以及不同模式有什么差異。
上面是一個單表1.3G 的SIZE 的表。
下面我們需要對這個表進(jìn)行一個整體的 COUNT 運(yùn)算,我們來看看使用緩沖和不使用有什么區(qū)別
1 我們可以先裸奔一下,1.3G 大小的表進(jìn)行COUNT運(yùn)算時,整體的速度在不到2秒可以給出結(jié)果(I am sorry, 我的I/O 系統(tǒng)是 SSD)
2 我們將數(shù)據(jù)進(jìn)行預(yù)讀
select pg_prewarm('bloom_table','read','main');
3 我們將模式調(diào)整為 buffer 模式
explain analyze select count(*) from bloom_table;
4 最后我們使用 prefetch 模式,異步的方式進(jìn)行預(yù)讀
基本上這三種方式?jīng)]有特別大的差別,但實(shí)際上 read 為使用OS 系統(tǒng)緩沖的模式,buffer使用 postgresql 的buffer 模式, prefetch 為異步讀取數(shù)據(jù)模式。另一個需要注意的地方,就是大表的讀取到緩沖中與大表直接指向語句是不一樣的,如果你認(rèn)為僅僅通過select * from table 的方式就能將數(shù)據(jù)讀入到緩沖,postgresql 是不會允許這樣的事情發(fā)生的,一般這樣的操作僅僅是能將很少一部分?jǐn)?shù)據(jù)預(yù)讀進(jìn)緩沖。當(dāng)然如果你的內(nèi)存比較小的情況,你要注意這個問題,突然將一個大表讀入緩沖帶來的問題,可能是將正在使用的數(shù)據(jù)從你的buffer 中 擠出,這可不是什么好的操作。
關(guān)于“PostgreSQL數(shù)據(jù)讀取快慢怎么辦”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
網(wǎng)站題目:PostgreSQL數(shù)據(jù)讀取快慢怎么辦
鏈接URL:http://www.dlmjj.cn/article/jodhos.html