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()?}'測試下是否成功安裝
????
??
????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
????
???
????接下來就是初始化數據庫: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的結果:
????
??
????
????
????補充一個圖還要查下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
????重啟數據庫;
????設置這兩個因子
????重新查詢下之前的語句
????
???
????
????4.2調整索引相關的成本因子
????重復之前調全表掃描因子的步驟,這里不再贅述。
????首先設置cpu_tuple_cost=1,random_page_cost=1,cpu_index_tuple_cost=1,cpu_operator_cost=1。設置的原因之后在進行解釋。
????
??
????執行如下語句: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
????我們再來重新調整完因子后再測試下語句
????
???
????
????
????最終結果是
????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成本因子调整的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Spark Summit East 2
- 下一篇: Flask-第二课:路由