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;
一般我们会比较关注消耗值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

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











1. 먼저 클릭하여 Douyin 앱을 열고 [나]를 클릭하세요. 2. 오른쪽 상단에 있는 점 3개 아이콘을 클릭하세요. 3. 클릭하여 [설정]으로 들어갑니다. 4. [계정 및 보안]을 클릭하여 엽니다. 5. [장치 관리에 로그인]을 선택하고 클릭하세요. 6. 마지막으로 장치를 클릭하여 선택하고 [제거]를 클릭하세요.

Xianyu는 거래 플랫폼으로서 사용하기 전에 계정에 등록하고 로그인해야 합니다. 사용자는 자신의 계정에 대한 ID 이름을 설정할 수 있습니다. 아래에서 함께 알아볼까요! Xianyu에서 개인 닉네임을 확인하는 방법을 소개합니다. 먼저 Xianyu 앱을 시작하고, 홈페이지에 진입한 후 방치, 메시지, 나 판매 페이지로 전환한 후 오른쪽 하단의 [내] 옵션을 클릭합니다. 2. 그런 다음 내 페이지의 왼쪽 상단에 있는 [아바타]를 클릭해야 합니다. 2. 그런 다음 개인 홈페이지로 이동하면 여기에서 [정보 편집] 버튼을 클릭해야 합니다. 4. 마지막으로 정보를 편집하는 페이지에서 나중에 볼 수 있음을 클릭합니다.

1. 휴대폰을 켠 후 NetEase Cloud Music을 선택합니다. 2. 홈페이지에 입장하시면 누구나 [랭킹리스트]를 확인하실 수 있으며, 클릭하시면 입장 가능합니다. 3. 순위 목록에서 원하는 목록을 선택한 후 [신곡 목록]을 클릭하세요. 4. 좋아하는 노래를 선택하고 클릭하세요. 5. 더 많은 목록을 보려면 이전 페이지로 돌아가세요.

삶이나 일에 관계없이 많은 사람들이 오랫동안 WeChat에 깊이 연결되어 있으며 언제든지 다양한 그룹에 참여하게 될 것입니다. 그러면 얼마나 많은 WeChat 그룹에 가입하셨나요? 주소록에 있는 그룹 채팅을 즉시 보고 싶을 수도 있지만 주소록에 저장한 WeChat 그룹만 여기에 표시되고 다른 그룹은 표시되지 않습니다. 가입한 모든 WeChat 그룹을 보려면 매우 간단합니다. WeChat 홈페이지의 검색창에 닉네임을 입력한 다음 검색 결과에서 그룹 채팅 섹션을 찾아 "그룹 채팅 더보기"를 클릭하면 됩니다. 관련된 모든 그룹 채팅 정보. 암튼 100개도 넘게 있었는데, 오른쪽 스크롤바가 엄청 작아져서 놀랐습니다. 아쉽게도 구체적인 숫자 통계는 없습니다... 이 방법은 귀하가 가입한 QQ 그룹을 확인하는 데에도 적용됩니다. 추신: 일부 네티즌들은 다음과 같은 트릭도 제공했습니다.

Kuaishou Live Companion은 강력한 라이브 방송 보조 도구일 뿐만 아니라 방송사를 위해 만들어진 인기 주제와 트렌드에 대한 실시간 통찰력 플랫폼이기도 합니다. 이 기능을 통해 앵커는 시청자가 가장 궁금해하는 콘텐츠를 빠르게 포착한 뒤, 시청자의 취향과 관심에 더욱 부합하도록 라이브 콘텐츠를 조정할 수 있다. 그렇다면 Kuaishou Live Companion 앱에서 인기 동영상 목록을 확인하는 방법은 무엇입니까? 이 튜토리얼 가이드가 귀하에게 도움이 되기를 바랍니다. Kuaishou Live Companion에서 핫 비디오 목록을 보는 방법 두 번째 단계는 일일 비디오 핫 목록을 클릭하는 것입니다. 세 번째 단계는 일일 영상 핫리스트를 확인하는 것입니다.

WeChat 그룹 채팅은 단순한 채팅 플랫폼일 뿐만 아니라 각계각층의 엘리트와 열성적인 친구들을 하나로 모으는 커뮤니케이션 서클입니다. 그래서 오늘은 WeChat에 추가한 그룹 수를 확인하는 방법과 저장하는 방법을 알려드리겠습니다. 일반적으로 WeChat을 사용하는 사용자는 놓치지 마세요. WeChat에 추가한 그룹 수를 확인하는 방법 및 그룹 채팅을 저장하는 방법 WeChat에 추가한 그룹 수를 확인하려면: 1. WeChat 기본 인터페이스에서 그룹 채팅 창을 볼 수 있습니다. 2. 이미 저장한 경우 그룹 채팅은 [주소록] - [그룹 채팅]을 누르시면 됩니다. 3. 그룹 채팅에 진입하신 후 저장된 그룹을 보실 수 있습니다. 위챗 그룹 저장: 1. 오른쪽 상단 [.. .] 2. 채팅 메시지 열기 [주소록에 저장] 3. 위챗 메인 인터페이스에서 [주소록]-[그룹 채팅]을 눌러 확인하세요.

1. 먼저 Gaode 지도를 엽니다. 2. Amap 홈페이지 우측 하단의 (내)를 클릭하신 후, 우측 상단의 설정을 클릭하세요. 3. 마지막으로 Amap의 도움말 센터를 볼 수 있습니다.

중관촌 뉴스: 4월 18일 오전, 화웨이는 갑자기 P70 시리즈 휴대폰이 파이오니어 플랜에 따라 공식적으로 판매된다고 발표했습니다. 구매를 원하는 친구들은 과거 관행에 따르면 화웨이의 주력 휴대폰을 준비해야 합니다. 인기가 많아 항상 품절 상태입니다. 이번에 Huawei P70 시리즈는 순수함을 의미하는 Pura로 이름이 변경되었습니다. 이전에 Huawei의 Yu Chengdong은 다음과 같이 말했습니다. 2012년부터 Huawei의 P 시리즈 스마트폰은 전 세계 수억 명의 사용자와 함께 수많은 소중한 순간을 보내고 삶의 아름다움과 흥분을 함께 목격하는 충실한 파트너와 같습니다. 그는 화웨이 P 시리즈를 선택하는 모든 사용자가 제공하는 신뢰와 사랑이 화웨이가 혁신의 길에서 굳건히 전진할 수 있도록 항상 격려하는 강력한 원동력과 같다고 깊이 느꼈습니다. 푸라(Pura)는 순수하다는 뜻이다.
