PostgreSQL查询SQL语义分析(1)—解析查询对象addRangeTableEntry

PostgreSQL查询SQL语义分析(1)—解析查询对象addRangeTableEntry,第1张

本文主要介绍PG在执行查询时,对SQL的语义分析重写过程中的查询对象解析过程,处理的函数为addRangeTableEntry,分析查询对象信息。

本函数是解析查询 (包含增删改查 *** 作) 执行过程中涉及的查询对象 (表、视图、子查询等) 的信息。

每次调用只解析一个对象。

1、通过观察addRangeTableEntry的执行过程,了解SQL语义解析transformFromClause的处理过程。

2、表结构信是从缓存中结构读取,然后获取自己需要的信息。

3、语义分析后转换为relid(关联对象id),提升查询执行的处理效率。

Unix时间戳(Unix timestamp),或称Unix时间(Unix time)、POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数。Unix时间戳不仅被使用在Unix系统、类Unix系统中,也在许多其他 *** 作系统中被广泛采用。

postgresql查询数据时,很多情况时间格式是时间戳样式的,可读性很差,需要转换成普通格式的,在查询时,转换方法如下:

select md5, to_char(to_timestamp(time),'yyyy-MM-dd HH24-MI-SS') as time from tablename;

PostgreSQL命令 EXPLAIN ANALYZE 是日常工作中了解和优化SQL查询过程所用到的最强大工具,后接如 SELECT , UPDATE 或者 DELETE 等SQL语句,命令执行后并不返回数据,而是输出查询计划,详细说明规划器通过何种方式来执行给定的SQL语句。

下面是从 Postgres Using EXPLAIN 提取的查询:

它生成的查询计划:

Postgres构建了一个规划节点的树结构,以表示所采取的不同 *** 作,其中root根和每个 -> 指向其中一个 *** 作。在某些情况下, EXPLAIN ANALYZE 会提供除执行时间和行数之外的额外执行统计信息,例如上面例子中的 Sort 及 Hash 。除第一个没有 -> 的行之外的任何行都是诸如此类的信息,因此查询的结构是:

每个树分支代表子动作,从里到外以确定哪个是“第一个”发生(尽管同一级别的节点顺序可能不同)。

在 tenk_unique1 索引上执行的第一个 *** 作是 Bitmap Index Scan :

这对应于SQL WHERE t1unique1 < 100 。Postgres查找与条件 unique1 < 100 匹配的行位置。此处不会返回行数据本身。成本估算 (cost=000504 rows=101 width=0) 意味着Postgres预期将“花费” 任意计算单位的 504 来找到这些行。000是此节点开始工作的成本(在这种情况下,即为查询的启动时间)。 rows 是此索引扫描将返回的预估行数, width 是这些返回行的预估大小(以字节为单位)(0是因为这里只关心位置,而不是行数据的内容)。

因为使用了 ANALYZE 选项运行 EXPLAIN ,所以查询被实际执行并捕获了计时信息。 (actual time=00490049 rows=100 loops=1) 表示索引扫描执行了1次( loops 值),结果返回了100行,实际时间是0 如果节点执行了多次,实际时间是每次迭代的平均值,可以将该值乘以循环次数以获取实际时间。基于成本的最小/最大时间的概念,范围值也可能会有所不同。通过这些值,我们可以为该查询生成一个成本比率,每个成本单位为0049ms / 504单位≈001ms/单位。

索引扫描的结果将传递给 Bitmap Heap Scan *** 作。在此节点中,Postgres将获取别名为t1的tenk1表中行的位置,根据 unique1 < 100 条件筛选并获取行。

当乘以之前计算的001值时,我们可以得到成本预期的大概时间(22920 - 507)001≈224ms,同时每行实际时间为除以4后的结果:0526ms。这可能是因为成本估算是取的上限而不是取所有需读取的行,也或者因为Recheck条件总是生效。

和表顺序读取行(a Seq Scan )相比, Bitmap Index Scan 和 Bitmap Heap Scan 关联 *** 作成本要昂贵得多,但是因为在这种情况下只需要访问相对较少的行,所以关联 *** 作最终会变得更快。通过在获取行之前将行按照物理顺序排序来进一步加速,这会将单独获取的成本降到最低。节点名称中的“Bitmap”完成了排序 *** 作。

表扫描的结果(tenk1表中满足 unique1 < 100 条件的那些行)将在读取时被插入到内存的哈希表中。正如我们从成本中看到的那样,这根本不需要时间。

哈希节点包括散列桶(hash buckets)和批次数(batches)相关的信息,以及内存使用峰值情况。如果批次> 1,则还会包括未显示的磁盘使用信息。内存占用在100行 244字节= 244 kB时是有意义的,它非常接近28kB,我们假定这是哈希键本身所占用的内存。

接下来,Postgres从别名为t2的tenk2表读取所有的10000行,并根据tenk1表行的Hash检查它们。散列连接意味着将一个表的行输入到内存中的散列(先前的 *** 作中已构建),之后扫描另一个表的行,并根据散列表探测其值以进行匹配。在第二行可以看到“匹配”的条件, Hash Cond: (t2unique2 = t1unique2) 。请注意,因为查询是从tenk1和tenk2中选择所有值,所以在散列连接期间每行的宽度加倍。

现在已经收集了满足条件的所有行,可以对结果集进行排序 Sort Key: t1fivethous 。

Sort节点包含排序算法 quicksort 相关的信息 ,排序是在内存中还是在磁盘上完成(这将极大地影响速度),以及排序所需的内存/磁盘空间量。

熟悉如何解读查询计划会非常有助于优化查询。例如,Seq Scan节点通常表示添加索引的必要性,读取速度可能要快得多。

翻译并编辑,原文出处: >

select from (select 除了时间所有字段写出来,to_date('COMMENTTIME','yyyy-mm-dd hh24:mi:ss') time from T_SCHOOL_RECORDCOMMENT where RECORDID = :p_cid) order by time desc;

这样试试,但是你的时间字段用该保存为date类型,这样好像很麻烦。。

以上就是关于PostgreSQL查询SQL语义分析(1)—解析查询对象addRangeTableEntry全部的内容,包括:PostgreSQL查询SQL语义分析(1)—解析查询对象addRangeTableEntry、postgresql 时间戳怎么存储、PostgreSQL学习系列—EXPLAIN ANALYZE查询计划解读等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9447678.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存