<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        PostgreSQL的執行計劃分析

        來源:懂視網 責編:小采 時間:2020-11-09 09:42:54
        文檔

        PostgreSQL的執行計劃分析

        PostgreSQL的執行計劃分析:期有人提出想查看Postgresql的執行計劃,下面分析下PG執行計劃中的cost等相關值是怎么計算出來的: PG的版本是9.1.2 1.終端工具PGADMIN,對執行的語句按F7即可,然后看數據輸出和解釋 2.命令行分析:explain select * from table_name
        推薦度:
        導讀PostgreSQL的執行計劃分析:期有人提出想查看Postgresql的執行計劃,下面分析下PG執行計劃中的cost等相關值是怎么計算出來的: PG的版本是9.1.2 1.終端工具PGADMIN,對執行的語句按F7即可,然后看數據輸出和解釋 2.命令行分析:explain select * from table_name

        期有人提出想查看Postgresql的執行計劃,下面分析下PG執行計劃中的cost等相關值是怎么計算出來的: PG的版本是9.1.2 1.終端工具PGADMIN,對執行的語句按F7即可,然后看數據輸出和解釋 2.命令行分析:explain select * from table_name; 一般我們會比較關注消耗

        期有人提出想查看Postgresql的執行計劃,下面分析下PG執行計劃中的cost等相關值是怎么計算出來的:
        PG的版本是9.1.2

        1.終端工具PGADMIN,對執行的語句按F7即可,然后看數據輸出和解釋



        2.命令行分析:explain select * from table_name;

        一般我們會比較關注消耗值cost和掃描的方式,如走索引或者full scan全表掃描.當COST值消耗比較大時需要注意是否有優化的可能。
        與執行計劃相關的幾個參數,參看下面的示例:
        kenyon=# select count(1) from dba.website ;        --普通堆棧表,無任何索引約束
        count
        -------
        20
        (1 row)

        kenyon=# explain select * from dba.website ;
        QUERY PLAN
        --------------------------------------------------------
        Seq Scan on website (cost=0.00..1.20 rows=20 width=4)
        (1 row)

        --relpages磁盤頁,reltuples是行數(與實際不一定相符,一般略小)
        kenyon=# select relpages,reltuples from pg_class where relname = 'website';
        relpages | reltuples
        ----------+-----------
        1 | 20
        (1 row)

        kenyon=# select 1*1+20*0.01;
        --cost = relpages * seq_page_cost + reltuples * cpu_tuple_cost
        ?column?
        ----------
        1.20
        (1 row)

        kenyon=# show cpu_tuple_cost ;
        cpu_tuple_cost
        ----------------
        0.01
        (1 row)

        kenyon=# show seq_page_cost;
        seq_page_cost
        ---------------
        1
        (1 row)


        --加限制條件的執行計劃

        kenyon=# select count(1) from dba.website where hits >15;
        count
        -------
        5
        (1 row)

        kenyon=# explain select * from dba.website where hits >15;
        QUERY PLAN
        -------------------------------------------------------
        Seq Scan on website (cost=0.00..1.25 rows=5 width=4)
        Filter: (hits > 15)
        (2 rows)

        kenyon=# show cpu_operator_cost ;
        cpu_operator_cost
        -------------------
        0.0025
        (1 row)

        因為掃描的總數是20行,不變的,所以COST不會下降,相反反而增加了0.05,這是因為額外消耗了CPU的時間去檢查符合約束條件數據,即cost 在原來的基礎上再增加 20 * 0.0025 = 0.05 (reltuples * cpu_operator_cost)


        --加索引的執行計劃
        kenyon=# select count(1) from dba.website_2 ;
        count
        -------
        8000
        (1 row)

        kenyon=# explain select * from dba.website_2 ;
        QUERY PLAN
        --------------------------------------------------------------
        Seq Scan on website_2 (cost=0.00..112.00 rows=8000 width=4)
        (1 row)

        kenyon=# select relpages,reltuples from pg_class where relname = 'website_2';
        relpages | reltuples
        ----------+-----------
        32 | 8000
        (1 row)

        kenyon=# explain select * from dba.website_2 where hits >7900; --走的索引
        QUERY PLAN
        ----------------------------------------------------------------------------------
        Index Scan using ind_website_2 on website_2 (cost=0.00..10.00 rows=100 width=4)
        Index Cond: (hits > 7900)
        (2 rows)
        ()
        kenyon=# explain select * from dba.website_2 where hits >10; --未走索引(不滿足索引條件,full scan)
        QUERY PLAN
        --------------------------------------------------------------
        Seq Scan on website_2 (cost=0.00..132.00 rows=7991 width=4) -- 132 = 112+8000*0.0025
        Filter: (hits > 10)
        (2 rows)


        雖然讀取的COST更大,但是因為索引的緣故,訪問的數據量變小了,所以總體COST是下降的。
        --多表JOIN的執行計劃 示例: 若想看實際的一個執行時間,可以加上 analyze 參數
        kenyon=# explain analyze select * from dba.website a ,dba.website_2 b where a.hits = b.hits and a.hits >18;
        QUERY PLAN
        ---------------------------------------------------------------------------------------------------------------------------------------
        Merge Join (cost=1.26..1.90 rows=2 width=8) (actual time=0.070..0.075 rows=2 loops=1)
        Merge Cond: (b.hits = a.hits)
        -> Index Scan using ind_website_2 on website_2 b (cost=0.00..235.25 rows=8000 width=4) (actual time=0.013..0.020 rows=21 loops=1)
        -> Sort (cost=1.26..1.26 rows=2 width=4) (actual time=0.035..0.037 rows=2 loops=1)
        Sort Key: a.hits
        Sort Method: quicksort Memory: 17kB
        -> Seq Scan on website a (cost=0.00..1.25 rows=2 width=4) (actual time=0.009..0.011 rows=2 loops=1)
        Filter: (hits > 18)
        Total runtime : 0.120 ms
        (9 rows)
        total runtime 是執行器啟動和關閉的時間,但不包括解析,重寫和規劃的時間
        注意: pg_class中的relpages,reltuples數據不是實時更新的,一般在vacuum analyze和少部分DDL(如建立索引)后更新。
        示例1:
        kenyon=# insert into dba.website select generate_series(8000,9000);
        INSERT 0 1001
        kenyon=# select relpages,reltuples,relname,relkind from pg_class where relname like '%website%';
        relpages | reltuples | relname | relkind
        ----------+-----------+---------------+---------
        1 | 20 | website | r
        32 | 8000 | website_2 | r
        20 | 8000 | ind_website_2 | i
        (3 rows)

        kenyon=# vacuum analyze dba.website;
        VACUUM
        kenyon=# vacuum analyze dba.website;
        VACUUM
        kenyon=# select relpages,reltuples,relname,relkind from pg_class where relname like '%website%';
        relpages | reltuples | relname | relkind
        ----------+-----------+---------------+---------
        5 | 1021 | website | r
        36 | 8999 | website_2 | r
        22 | 8999 | ind_website_2 | i
        (3 rows)
        示例2:
        kenyon=# insert into dba.website select generate_series(8000,9000);
        INSERT 0 1001
        kenyon=# select relpages,reltuples,relname,relkind from pg_class where relname like '%website%';
        relpages | reltuples | relname | relkind
        ----------+-----------+---------------+---------
        1 | 21 | website | r
        36 | 8999 | website_2 | r
        22 | 8999 | ind_website_2 | i
        (3 rows)

        kenyon=# create index ind_website on dba.website(hits);
        CREATE INDEX
        kenyon=# select relpages,reltuples,relname,relkind from pg_class where relname like '%website%';
        relpages | reltuples | relname | relkind
        ----------+-----------+---------------+---------
        5 | 1022 | website | r
        36 | 8999 | website_2 | r
        22 | 8999 | ind_website_2 | i
        5 | 1022 | ind_website | i
        (4 rows)
        所涉及的系統表:
        pg_stats
        pg_statistic
        pg_class
        pg_stat是任何人都可以看的,而且可讀性高,比較直觀,pg_statistic只有superuser才能讀,并且可讀性差,普通人員建議看pg_stats,pg_stats是pg_statistic的視圖。 這兩個表也不是實時更新的,需要vacuum analyze時會更新
        所涉及的系統變量:
        default_statistics_target
        geqo_threshold
        join_collapse_limit
        from_collapse_limit
        kenyon=# show default_statistics_target ;
        default_statistics_target
        ---------------------------
        100
        (1 row)

        kenyon=# show geqo_threshold ; --這個參數的大小會設置執行計劃從窮舉搜索到概率選擇性搜索的臨界值
        geqo_threshold
        ----------------
        12
        (1 row)

        kenyon=# show join_collapse_limit ; --join連接走執行計劃上限
        join_collapse_limit
        ---------------------
        8
        (1 row)

        kenyon=# show from_collapse_limit ;
        from_collapse_limit
        ---------------------
        8
        (1 row)
        EXPLAIN
        Name
        EXPLAIN— show the execution plan of a statement
        Synopsis
        EXPLAIN [ ( option [, ...] ) ] statement
        EXPLAIN [ ANALYZE ] [ VERBOSE ] statement
        where option can be one of:
        ANALYZE [ boolean ]
        VERBOSE [ boolean ]
        COSTS [ boolean ]
        BUFFERS [ boolean ]
        FORMAT { TEXT | XML | JSON | YAML }

        例子:
        kenyon=# explain (analyze,verbose,costs,buffers) select id from dba.test222 order by id desc limit 1;
        QUERY PLAN
        ------------------------------------------------------------------------------------------------------------------------------
        Limit (cost=1807.80..1807.80 rows=1 width=4) (actual time=87.167..87.168 rows=1 loops=1)
        Output: id
        Buffers: shared hit=393
        -> Sort (cost=1807.80..2043.60 rows=94320 width=4) (actual time=87.165..87.165 rows=1 loops=1)
        Output: id
        Sort Key: test222.id
        Sort Method: top-N heapsort Memory: 17kB
        Buffers: shared hit=393
        -> Seq Scan on dba.test222 (cost=0.00..1336.20 rows=94320 width=4) (actual time=0.036..42.847 rows=100000 loops=1)
        Output: id
        Buffers: shared hit=393
        Total runtime: 87.183 ms
        (12 rows)

        kenyon=# explain (analyze,verbose,costs,buffers) select max(id) from dba.test222;
        QUERY PLAN
        ------------------------------------------------------------------------------------------------------------------------
        Aggregate (cost=1572.00..1572.01 rows=1 width=4) (actual time=77.679..77.680 rows=1 loops=1)
        Output: max(id)
        Buffers: shared hit=393
        -> Seq Scan on dba.test222 (cost=0.00..1336.20 rows=94320 width=4) (actual time=0.012..36.908 rows=100000 loops=1)
        Output: id
        Buffers: shared hit=393
        Total runtime: 77.701 ms
        (7 rows)
        explain參數解釋:
        ANALYZE :執行命令并顯示執行事件,默認false
        VERBOSE :對執行計劃提供額外的信息,如查詢字段信息等,默認false
        COSTS :顯示執行計劃的,默認true
        BUFFERS :默認false,前置條件是analyze
        FORMAT :默認格式是text

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        PostgreSQL的執行計劃分析

        PostgreSQL的執行計劃分析:期有人提出想查看Postgresql的執行計劃,下面分析下PG執行計劃中的cost等相關值是怎么計算出來的: PG的版本是9.1.2 1.終端工具PGADMIN,對執行的語句按F7即可,然后看數據輸出和解釋 2.命令行分析:explain select * from table_name
        推薦度:
        標簽: 查看 計劃 有人
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲免费无码在线| 深夜福利在线视频免费| 久久久久亚洲AV成人网| 亚洲AV综合永久无码精品天堂| 免费精品国产自产拍在| 亚洲国产成a人v在线观看 | 九九美女网站免费| 亚洲av日韩av不卡在线观看| 99视频在线免费| 亚洲一区二区三区在线观看蜜桃| 国产99视频精品免费观看7| 国产精品亚洲自在线播放页码 | 精品一区二区三区高清免费观看| 亚洲精品无码av天堂| 免费人成激情视频在线观看冫| 亚洲av永久无码精品网站| 91麻豆最新在线人成免费观看| jlzzjlzz亚洲jzjzjz| 国产精品久久香蕉免费播放| 乱爱性全过程免费视频| 亚洲国产成人高清在线观看 | 亚洲一区二区三区深夜天堂| 国产免费看插插插视频| 成人自慰女黄网站免费大全| 97久久精品亚洲中文字幕无码| 三年片在线观看免费观看高清电影| 亚洲大尺度无码无码专线一区| 久久乐国产精品亚洲综合| 日韩精品无码免费一区二区三区| 亚洲一卡2卡3卡4卡5卡6卡| 久久国产成人精品国产成人亚洲| 污视频在线观看免费| 亚洲国产AV无码一区二区三区 | 日韩精品成人无码专区免费| 黄色一级毛片免费| 亚洲综合久久久久久中文字幕| 免费的一级黄色片| 九九精品成人免费国产片| 亚洲成aⅴ人片久青草影院按摩| 亚洲乱亚洲乱妇无码麻豆| 国产免费AV片在线播放唯爱网|