日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

postgresql成本因子调整

發布時間:2025/3/17 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 postgresql成本因子调整 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

????postgresql因子的調整主要有這四個cpu_tuple_cost,random_page_cost,cpu_index_tuple_cost,cpu_operator_cost。這四個因子的值影響著計劃中的cost值,這個因子大小的是否正確很大程度的影響著執行計劃走的是否正確。
????1.安裝systemtap
????需要用到的工具是systemtap,在安裝systemtap前請先進行如下操作
????

之后安裝相同版本號的kernel-devel,kernel-debuginfo,kernel-debuginfo-common(注意包括小版本號一定要相同)

????至于去哪找這些rpm包我是從這里找到的http://rpm.pbone.net/index.php3。如果實在找不到同版本的這3個安裝包建議換個版本的系統吧。之后安裝systemtap,


???
?如果安裝完后應該是有這些包


??

??下面輸入這個

????[root@bogon?~]#?stap?-ve?'probe?begin?{?log("hello?world")?exit()?}'測試下是否成功安裝
????

??

?2.安裝postgresql

????systemtap安裝成功后開始安裝postgresql,我安裝的版本的9.3,源碼安裝的
????

????安裝步驟,就解壓后到目錄中執行
????[postgres@bogon?postgresql-9.3.0]$?./configure?--prefix=/home/postgres/data?--enable-dtrace


??
??之后就是
????[postgres@bogon?postgresql-9.3.0]$?make?&&?make?install
????完成后運行下
????[postgres@bogon?bin]$?pg_config?--configure
????

???

?確保一定要有--enable-dtrace這個東西,這個就是允許探針訪問pg的選項。

????接下來就是初始化數據庫:initdb?-D?數據庫目錄。
????[postgres@bogon?data]$?pg_ctl?start?-D?pgdata?啟動數據庫。
?
???3.調整因子前環境的配置
????創建測試用表:
????create?table?test(a?int,b?int);
????插入數據:(需要數據有一定的離散性)
????insert?into?test?select?random()1000000,random()1000000?from?generate_series(1,1000000);
????創建索引:
????create?index?index_a?on?test(a);
????更新統計信息:
????analyse;
????將數據寫入磁盤:
????checkpoint;
????關閉數據庫:
????pg_ctl?stop?-D?pgdata/
????清空操作系統緩存
????[root@bogon?~]#?sync;?echo?3?>?/proc/sys/vm/drop_caches
????下面就要使用stap了,具體代碼如下
????stap?-e?'
????global?a
????probe?process("/home/postgres/data/bin/postgres").mark("query__start")?{
????????delete?a
????????println("query__start?",?user_string($arg1),?"pid:",?pid())
????}
????probe?vfs.read.return?{
????????t?=?gettimeofday_ns()?-?@entry(gettimeofday_ns())
????????#?if?(execname()?==?"postgres"?&&?devname?!=?"N/A")
????????a[pid()]?<<<?t
????}
????probe?process("/home/postgres/data/bin/postgres").mark("query__done")?{
????????if?(@count(a[pid()]))?
????????printdln("**",?pid(),?@count(a[pid()]),?@avg(a[pid()]))
????????println("query__done?",?user_string($arg1),?"pid:",?pid())
????????if?(@count(a[pid()]))?{
????????println(@hist_log(a[pid()]))
????????#println(@hist_linear(a[pid()],1024,4096,100))
????}
??delete?a
}'?-x?2808
????這個a是一個數組中存著,pid號,多少次讀取數據塊,讀取數據塊的平均時間,stap監控著postgres這個進程,vfs.read.return這個函數是得到塊設備讀入一個數據塊的時間,并存入數組a中,最后返回pid號和讀取塊的次數和平均讀取時間。-x?后面的數字要設置為你監控的pid號
????postgres=#?select?pg_backend_pid();
????

????
????4.調整成本因子
????
????4.1調整全表掃描的相關因子
????首先得到會話的pid號之后運行前面呢段代碼:
????

??

??確定模塊是否加載上了

????[root@bogon?~]#?lsmod?|grep?stap
????

???

?執行如下語句:

????postgres=#?explain?(analyze,verbose,costs,buffers,timing)?select?*?from?test?;
????

????查看下stap的結果:
????

??

??最終看的結果就是a的數組中存儲的值就是18782**4439**148019(第一項pid號,第二個讀取塊次數,第三個讀取一次的平均時間),呢個value和count的圖就是讀取時間和次數的直方圖。

????
????
????補充一個圖還要查下pg_class中的relpages的數量,這個是整個表存儲的頁面數
????postgres=#?select?relpages?from?pg_class?where?relname='test';
????

???

?全表掃描的計算公式是什么呢?

????cost(真實執行時間)=seqscan_costrelpages+cpu_tuple_costlines(表的行數)
????根據上面的圖可以得到如下結果:
????cost=677.602
????seq_page_cost=148019*10^-6
????relpages=4425
????lines=1000000
????由這些值可得
????cpu_tuple_cost=0.000022617925
????seqscan_cost=0.148019
????這兩個值先記錄下來。
????我們可以set?seq_page_cost=0.148019;set?cpu_tuple_cost=0.000022617925;在進行全表掃描看下結果。
????重復之前操作清理下系統緩存:
????[root@bogon?~]#?sync;?echo?3?>?/proc/sys/vm/drop_caches
????重啟數據庫;
????設置這兩個因子
????重新查詢下之前的語句
????

???

?你會發現cost值是不是和真實值很接近呢。cpu_tuple_cost和sea_page_cost已經校準完成啦。

????
????4.2調整索引相關的成本因子
????重復之前調全表掃描因子的步驟,這里不再贅述。
????首先設置cpu_tuple_cost=1,random_page_cost=1,cpu_index_tuple_cost=1,cpu_operator_cost=1。設置的原因之后在進行解釋。
????

??

??關閉全表掃描set?enable_seqscan?=off;set?enable_bitmapscan?=off;

????執行如下語句:explain?(analyze,verbose,costs,buffers,timing)?select?*?from?test?where?a>489963;
????

????
????stap結果:
????

????索引掃描的代價計算公式是:
????cost=random_page_costblocks+cpu_tuple_costline1+cpu_index_tuple_costline2+cpu_operator_costline2
????cost=9283.272
????random_page_cost=1.534983
????line1=508823
????line2=?
????blocks=?
????這個line2就和之前設置所有因子都是1就有關系了,我們可以通過調整cpu_operator_cost為2其他因子不變,兩個得到的cost結果相減就可以得到line2了,blocks也是同理通過調整random_page_cost來得到結果。
????

???

?line2=2041453-1532460=508993

????
????

?
?blocks=1538282-1532460=5822
????2cpu_operator_cost=cpu_index_tuple_cost
????綜上可得出
????cpu_operator_cost=0.00548671355463809587
????cpu_index_tuple_cost=0.01097342710927619174
????random_page_cost=1.534983
????我們再來重新調整完因子后再測試下語句
????

???

?和真實值有點偏差,可能是因為systemtap會占用一定的cpu資源,我這個是關閉systemtap進行測試的。

????
????
????最終結果是
????cpu_operator_cost=0.00548671355463809587
????cpu_index_tuple_cost=0.01097342710927619174
????random_page_cost=1.534983
????cpu_tuple_cost=0.000022617925
????seqscan_cost=0.148019

總結

以上是生活随笔為你收集整理的postgresql成本因子调整的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。