濮阳杆衣贸易有限公司

主頁 > 知識庫 > PostgreSQL將數據加載到buffer cache中操作方法

PostgreSQL將數據加載到buffer cache中操作方法

熱門標簽:孝感銷售電銷機器人廠家 無錫梁溪公司怎樣申請400電話 江西穩(wěn)定外呼系統(tǒng)供應商 北京智能外呼系統(tǒng)供應商家 電話機器人錄音師薪資 奧維地圖標注字體大小修改 中國地圖標注省份用什么符號 高德地圖標注電話怎么沒了 智能電銷機器人教育

我們都知道數據在緩存中訪問遠比在磁盤中訪問速度要快,那么我們怎么在pg中將指定的數據加載到緩存中呢,這有點類似于Oracle的in-memory。

當然要注意并不是把數據加載到內存中就一定是好的,因為相較于磁盤,內存總是有限的,所以一幫我們只是在特殊場合下將需要的數據加載到內存中來加快訪問的速度。

我們可以使用pg_prewarm插件來將指定的表加載到OS Buffer或者pg shared buffer中。

安裝:

bill=# create extension pg_prewarm ;
CREATE EXTENSION

性能測試:

構建測試表t1,t2,分別插入1000W條測試數據

bill=# create table t1(id int,info text);
CREATE TABLE
bill=# create table t2(id int,info text);
CREATE TABLE
bill=# insert into t1 select generate_series(1,10000000),md5(random()::text);
INSERT 0 10000000
bill=# insert into t2 select generate_series(1,10000000),md5(random()::text);
INSERT 0 10000000

測試前先清空shared_buffer,可以使用下面sql查看shared_buffer使用情況:
安裝pg_buffercache插件:

bill=# create extension pg_buffercache;
CREATE EXTENSION

查詢shared_buffer使用情況:

SELECT
    c.relname,
    count(*) AS buffers
FROM pg_buffercache b
INNER JOIN pg_class c
   ON b.relfilenode = pg_relation_filenode(c.oid)
    AND b.reldatabase IN (0, (SELECT oid FROM pg_database
WHERE datname = current_database()))
GROUP BY c.relname
ORDER BY 2 DESC;
                 relname                 | buffers
-----------------------------------------+---------
 pg_attribute                            |      36
 pg_proc                                 |      27
 pg_class                                |      15
 pg_operator                             |      14
 pg_depend_reference_index               |      13
 pg_depend                               |      11
 pg_attribute_relid_attnum_index         |      10
 pg_proc_proname_args_nsp_index          |       9
......

可以看到t1和t2表均不在shared_buffer中,我們來手動將t2表加載到shared_buffer中。

bill=# SELECT pg_prewarm('t2');
 pg_prewarm
------------
      83334
(1 row)

性能測試:

可以看到全表掃描t2表的性能要提升不少。

bill=# explain analyze select * from t1;
                                                    QUERY PLAN
------------------------------------------------------------------------------------------------------------------
 Seq Scan on t1  (cost=0.00..183334.80 rows=10000080 width=37) (actual time=0.060..772.902 rows=10000000 loops=1)
 Planning Time: 0.294 ms
 Execution Time: 1044.922 ms
(3 rows)

Time: 1045.722 ms (00:01.046)

bill=# explain analyze select * from t2;
                                                    QUERY PLAN
------------------------------------------------------------------------------------------------------------------
 Seq Scan on t2  (cost=0.00..183334.80 rows=10000080 width=37) (actual time=0.012..519.691 rows=10000000 loops=1)
 Planning Time: 0.280 ms
 Execution Time: 790.607 ms
(3 rows)

Time: 791.314 ms

pg_prewarm其它介紹:

下面主要介紹下pg_prewarm函數:
該函式的創(chuàng)建語句如下:

CREATE FUNCTION pg_prewarm(regclass,
mode text default buffer,
fork text default main,
first_block int8 default null,
last_block int8 default null)
RETURNS int8
AS MODULE_PATHNAME, pg_prewarm
LANGUAGE C

參數如下:

  • regclass:要做prewarm的表名
  • mode:prewarm模式。prefetch表示異步預取到os cache;read表示同步預取;buffer表示同步讀入PG的shared buffer
  • fork:relation fork的類型。一般用main,其他類型有visibilitymap和fsm
  • first_block last_block:開始和結束塊號。表的first_block=0,last_block可通過pg_class的relpages字段獲得
  • RETURNS int8:函數返回pg_prewarm處理的block數目(整型)

可能有人會想:我直接將表select *全表查詢一遍不就可以將數據加載到緩存中了嘛,為什么還需要使用pg_prewarm呢?因為對于大小超過shared_buffer/4的表進行全表掃描時,pg一般不會使用全部的shared_buffer,而是只使用很少一部分的shared_buffer。所以,將大表加載到緩存中不能用一個查詢來直接實現(xiàn)的,而pg_prewarm正好可以滿足這個需求。

參考鏈接:

https://www.postgresql.org/docs/13/pgprewarm.html
https://www.postgresql.org/docs/13/pgbuffercache.html

到此這篇關于PostgreSQL將數據加載到buffer cache中的文章就介紹到這了,更多相關PostgreSQL數據加載buffer cache內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • PostGreSql 判斷字符串中是否有中文的案例
  • PostgreSQL的中文拼音排序案例
  • 自定義函數實現(xiàn)單詞排序并運用于PostgreSQL(實現(xiàn)代碼)
  • 在PostgreSQL中使用ltree處理層次結構數據的方法
  • postgresql 中的時間處理小技巧(推薦)
  • Postgresql限制用戶登錄錯誤次數的實例代碼
  • PostgreSQL用戶登錄失敗自動鎖定的處理方案
  • postgresql影子用戶實踐場景分析
  • 如何使用PostgreSQL進行中文全文檢索

標簽:阜陽 海北 荊州 臨滄 通化 齊齊哈爾 那曲 泰州

巨人網絡通訊聲明:本文標題《PostgreSQL將數據加載到buffer cache中操作方法》,本文關鍵詞  PostgreSQL,將,數據,加載,到,;如發(fā)現(xiàn)本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《PostgreSQL將數據加載到buffer cache中操作方法》相關的同類信息!
  • 本頁收集關于PostgreSQL將數據加載到buffer cache中操作方法的相關信息資訊供網民參考!
  • 推薦文章
    丰顺县| 肇庆市| 鄂尔多斯市| 读书| 紫阳县| 东莞市| 东安县| 揭东县| 绥滨县| 津南区| 正宁县| 嘉善县| 龙胜| 公安县| 丰镇市| 桃江县| 临漳县| 睢宁县| 谢通门县| 安徽省| 吉水县| 鄢陵县| 林周县| 黑河市| 淮安市| 清流县| 邢台县| 景泰县| 秭归县| 石台县| 翁牛特旗| 中卫市| 开平市| 宁波市| 石屏县| 富顺县| 乌兰察布市| 和硕县| 河曲县| 湖北省| 历史|