Skip to main content

moregeek program

pg--执行计划之辅助算法_mysql dba攻坚之路的博客-多极客编程

Sort

需要排序数据时,这个节点就会作为计划树的一部分被添加。可以显式或隐式地要求排序数据

postgres=# drop table demotable;
DROP TABLE
postgres=# CREATE TABLE demotable (num numeric, id int);
CREATE TABLE
postgres=# INSERT INTO demotable SELECT random() * 1000, generate_series(1, 10000);
INSERT 0 10000
postgres=# explain select * from demotable order by num;
QUERY PLAN
---------------------------------------------------------------------
Sort (cost=570.84..588.31 rows=6985 width=36)
Sort Key: num
-> Seq Scan on demotable (cost=0.00..124.85 rows=6985 width=36)
(3 rows)

即使用户要求最终输出按已排序的顺序,如果对应的表和排序列上有索引,则可能不会在最终计划中添加Sort节点。

postgres=# CREATE INDEX demoidx ON demotable(num);
CREATE INDEX
postgres=# explain select * from demotable order by num;
QUERY PLAN
--------------------------------------------------------------------------------
Index Scan using demoidx on demotable (cost=0.29..534.28 rows=10000 width=15)
(1 row)

Merge Join需要在连接之前对两个表数据进行排序。因此,可能会发现Merge Join比其他任何连接方法的成本都要低,即使需要额外的排序成本。因此,在本例中,Sort节点将添加到表的连接和扫描方法之间,以便将已排序的记录传递给连接方法。

postgres=# create table demo1(id int, id2 int);
CREATE TABLE
postgres=# insert into demo1 values(generate_series(1,1000), generate_series(1,1000));
INSERT 0 1000
postgres=# create table demo2(id int, id2 int);
CREATE TABLE
postgres=# create index demoidx2 on demo2(id);
CREATE INDEX
postgres=# insert into demo2 values(generate_series(1,100000), generate_series(1,100000));
INSERT 0 100000
postgres=# analyze;
ANALYZE
postgres=# explain select * from demo1, demo2 where demo1.id=demo2.id;
QUERY PLAN
------------------------------------------------------------------------------------
Merge Join (cost=65.12..115.04 rows=1000 width=16)
Merge Cond: (demo2.id = demo1.id)
-> Index Scan using demoidx2 on demo2 (cost=0.29..3050.29 rows=100000 width=8)
-> Sort (cost=64.83..67.33 rows=1000 width=8)
Sort Key: demo1.id
-> Seq Scan on demo1 (cost=0.00..15.00 rows=1000 width=8)
(6 rows)


Aggregate

如果有某个聚合函数用于从多个输入元组中计算以得到单个结果,那么Aggregate节点就会作为规划树的一部分被添加。一些常用的聚合函数是COUNT, SUM, AVG (AVERAGE), MAX (MAXIMUM)和MIN (MINIMUM)。

postgres=# explain select count(*) from demo1;
QUERY PLAN
---------------------------------------------------------------
Aggregate (cost=17.50..17.51 rows=1 width=8)
-> Seq Scan on demo1 (cost=0.00..15.00 rows=1000 width=0)
(2 rows)

postgres=# explain select sum(demo1.id) from demo1, demo2 where demo1.id=demo2.id;
QUERY PLAN
-----------------------------------------------------------------------------------------------
Aggregate (cost=117.54..117.55 rows=1 width=8)
-> Merge Join (cost=65.12..115.04 rows=1000 width=4)
Merge Cond: (demo2.id = demo1.id)
-> Index Only Scan using demoidx2 on demo2 (cost=0.29..3050.29 rows=100000 width=4)
-> Sort (cost=64.83..67.33 rows=1000 width=4)
Sort Key: demo1.id
-> Seq Scan on demo1 (cost=0.00..15.00 rows=1000 width=4)
(7 rows)

HashAggregate

如果聚合发生在未排序的数据集上,那么HashAggregate可以被组级聚合使用

postgres=# explain select count(*) from demo1 group by id2;
QUERY PLAN
---------------------------------------------------------------
HashAggregate (cost=20.00..30.00 rows=1000 width=12)
Group Key: id2
-> Seq Scan on demo1 (cost=0.00..15.00 rows=1000 width=4)
(3 rows)

这里的demo1表模式数据与前一节中显示的示例相同。由于只需要对1000行进行分组,因此构建哈希表所需的资源要小于排序的成本。查询规划器决定选择HashAggregate。


GroupAggregate

GroupAggregate用于处理已经排好序的数据,因此不需要任何额外的数据结构

postgres=# explain select count(*) from demo2 group by id2;
QUERY PLAN
-------------------------------------------------------------------------
GroupAggregate (cost=9747.82..11497.82 rows=100000 width=12)
Group Key: id2
-> Sort (cost=9747.82..9997.82 rows=100000 width=4)
Sort Key: id2
-> Seq Scan on demo2 (cost=0.00..1443.00 rows=100000 width=4)
(5 rows)

其他常用

limit (SELECT查询中使用了“ limit / offset”子句

explain select * from demo1 offset 5 limit 10;

unique (distinct)

explain select distinct(id) from demo2 where id<100;

lockrows(for update)

explain select * from demo1 for update;

setop (合并结果)

explain select * from emp where age>25 intersect select * from emp where salary > 95;

append (union)

subquery scan (子查询)

function scan (使用函数)

values scan (指定结果集)


©著作权归作者所有:来自51CTO博客作者进击的CJR的原创作品,请联系作者获取转载授权,否则将追究法律责任

pg--扫描方式_mysql dba攻坚之路的博客-多极客编程

CTID是什么CTID是一个系统列,用于标识某一元组位于哪个位置,由(block number + 块内的偏移量offset)组成和oracle的rowid十分类似select attname from pg_attribute where attrelid='test2'::regclass; attname ---------- cmax cmin ctid 类似oracle的r

keewidb:兼容redis协议,领跑nosql_腾讯云数据库的博客-多极客编程

如果现在的我们离开了互联网,生活会是什么样子?互联网++++,已经深刻渗透到人们的生活中。不知道大家有没有想过?每一个互联网+结合的背后都是海量的存储需求。你查看的每一个商品、组建的每一个战队、阅读的每一篇文章,基于互联网的每一个兴趣爱好,都有它的key和value。在 key-value 数据库领域,Redis 因其高吞吐、低延迟、丰富的数据结构一直受开发者欢迎,但 Redis 全内存方案无法解

pg-日常运维_mysql dba攻坚之路的博客-多极客编程

VACUUM表膨胀是什么有效数据量不变,表越来越大,扫描的效率变低。是因为PG的MVCC写数据时,旧数据不删除,把新数据插入,将旧数据标记为无效,清理之前一直占用空间。执行update的话就是insert+delete的原理,依然会导致表膨胀。vacuum的作用磁盘清理dead tuple ;更新统计信息;重组数据;解决事务ID回卷问题。vacuum : 不要求获得排它锁,找到那些旧的“死”数据

pg--join方式_mysql dba攻坚之路的博客-多极客编程

PostgreSQL支持如下几种连接方式:Nested Loop JoinHash JoinMerge Joinpostgres=# create table blogtable1(id1 int, id2 int);CREATE TABLEpostgres=# create table blogtable2(id1 int, id2 int); CREATE TABLEpostgres=# i

mysql导入导出csv文件_雍州无名的博客-多极客编程

1.查看secure_file_privshow global variables like '%secure_file_priv%';secure_file_priv参数用于限制LOAD DATA, SELECT …OUTFILE, LOAD_FILE()传到哪个指定目录1.secure_file_priv 为 NULL 时,表示限制mysqld不允许导入或导出。2.secure_file_pr

kafka图形界面管理工具安装_雍州无名的博客-多极客编程

kafka图形界面管理工具以下2个工具可以使用:1.KafdropKafdrop是Apache Kafka的开源Web UI可视化界面 - Emil Koutanov,当谈到Kafka主题查看器和Web UI时,首选的开源工具是Kafdrop。在撰写本文时,有了80万个Docker拉动,并没有多少Kafka工具享有这种采用水平。这是有原因的:Kafdrop出色地填补了Kafka的可观察性工具中的明

crosslight仿真之(四)物理模型-2-能带能级_12392092的博客-多极客编程

​​crosslight仿真之(零)系列目录​​1. 能带结构1.1 公式:导带能级+禁带宽度=价带能级1.2 类禁带宽度的描述:体材料: band_gap纤锌矿材料:eg0_bulk替换band_gap量子材料:eg0_bar 或 eg0_well 替换band_gap1.3 类亲和势的描述:在活性材料中定义band_discont,覆盖affinity的值 或band_offset的值, 默认

【服务器数据恢复】虚拟机文件丢失导致hyper-v服务瘫痪,虚拟机无法使用的数据恢复案例_sun的博客-多极客编程

服务器数据恢复环境: Windows Server服务器,部署Hyper-V虚拟机环境; 虚拟机的硬盘文件和配置文件存放在某托管中心的存储设备中; 存储设备中4块硬盘组成阵列存储虚拟机的数据文件,单块4T硬盘存储虚拟机数据文件备份。 服务器故障分析&恢复方案: 由于存储设备中的虚拟机数据文件丢失,整个Hyper-V服务瘫痪,虚拟机无法使用。管理员联系我们数据恢复中心寻求帮助,北亚数据恢复工

10个不错的绘制流程框图的工具推荐_domi+1的博客-多极客编程

工作需要,搜索正好找到的一些绘制流程图工具。流程框图是一个不太详细的系统图表,其中部件由块表示,因此得名。与清楚地详细说明遵循某个系统的过程的示意图相比,框图要简单得多,因为它们不包含那么多信息。诸如流程名称之类的内容是该图中最常见的部分。下面列出了其中一些工具以及对每个工具的简要但详细的说明。1、VisioOffice Visio 是Office软件系列中的负责绘制流程图和示意图的软件,是一款便

pg--join方式_mysql dba攻坚之路的博客-多极客编程

PostgreSQL支持如下几种连接方式:Nested Loop JoinHash JoinMerge Joinpostgres=# create table blogtable1(id1 int, id2 int);CREATE TABLEpostgres=# create table blogtable2(id1 int, id2 int); CREATE TABLEpostgres=# i

mysql导入导出csv文件_雍州无名的博客-多极客编程

1.查看secure_file_privshow global variables like '%secure_file_priv%';secure_file_priv参数用于限制LOAD DATA, SELECT …OUTFILE, LOAD_FILE()传到哪个指定目录1.secure_file_priv 为 NULL 时,表示限制mysqld不允许导入或导出。2.secure_file_pr

#yyds干货盘点#uniapp通过命令行打包_文本、的博客-多极客编程

如果有需要,就按照步骤来实现npm install -g cross-env之后就可以用各种命令了# 切换node版本(不一定需要)nvm use v16.2.0# 进入HBuild的cli目录# uni-app打包相关命令都封装在cli里面了cd /Applications/HBuilderX.app/Contents/HBuilderX/plugins/uniapp-cli/# 指定项目根地址