首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >理解查询和解释函数中的计数行为

理解查询和解释函数中的计数行为
EN

Stack Overflow用户
提问于 2017-04-02 07:52:10
回答 1查看 291关注 0票数 3

我很想了解(也许是改进)我在PostgreSQL 9.6中遇到的一个问题。名称简化了,但其他内容都是从psql会话中提取的。

我从一个物化视图mv开始。

首先,我创建了两个简单的函数:

代码语言:javascript
运行
AI代码解释
复制
CREATE FUNCTION count_mv() RETURNS BIGINT AS $$
SELECT COUNT(*) FROM mv;
$$ LANGUAGE SQL STABLE PARALLEL SAFE;

代码语言:javascript
运行
AI代码解释
复制
CREATE FUNCTION mv_pks() RETURNS TABLE (table_pk INTEGER) AS $$
SELECT table_pk FROM mv;
$$ LANGUAGE SQL STABLE PARALLEL SAFE;

让我们来问几个问题。

db=>\timing on

我可以非常快地计算物化视图的结果。

代码语言:javascript
运行
AI代码解释
复制
db=> SELECT COUNT(*) FROM mv;
  count
---------
 2567883
(1 row)

Time: 79.803 ms

让我们看看它是怎么做到的。

代码语言:javascript
运行
AI代码解释
复制
db=> EXPLAIN ANALYZE SELECT COUNT(*) FROM mv;
                                                                  QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------------
 Finalize Aggregate  (cost=41331.24..41331.25 rows=1 width=8) (actual time=765.681..765.681 rows=1 loops=1)
   ->  Gather  (cost=41330.62..41331.23 rows=6 width=8) (actual time=765.557..765.670 rows=7 loops=1)
         Workers Planned: 6
         Workers Launched: 6
         ->  Partial Aggregate  (cost=40330.62..40330.63 rows=1 width=8) (actual time=760.175..760.175 rows=1 loops=7)
               ->  Parallel Seq Scan on mv  (cost=0.00..39261.09 rows=427809 width=0) (actual time=0.014..397.952 rows=366840 loops=7)
 Planning time: 0.326 ms
 Execution time: 769.934 ms
(8 rows)

好的。所以它利用了多个工人。但是为什么在使用EXPLAIN ANALYZE时查询速度要慢得多呢?

现在我使用count_mv()函数,它具有相同的底层SQL,并声明为STABLE

代码语言:javascript
运行
AI代码解释
复制
db=> select count_mv();
  count_mv
------------
    2567883
(1 row)

Time: 406.058 ms

哇哦!为什么这比物化视图上的相同SQL慢呢?再慢多了!它是否利用了平行工人,如果不是,原因何在?

开始编辑

如下所示,我加载了auto_explain模块,并在函数调用中检查了EXPLAIN的日志输出。

代码语言:javascript
运行
AI代码解释
复制
    Query Text:
    SELECT COUNT(*) FROM mv;

     Finalize Aggregate  (cost=41331.60..41331.61 rows=1 width=8) (actual time=1345.446..1345.446 rows=1 loops=1)
       ->  Gather  (cost=41330.97..41331.58 rows=6 width=8) (actual time=1345.438..1345.440 rows=1 loops=1)
            Workers Planned: 6
            Workers Launched: 0
             ->  Partial Aggregate  (cost=40330.97..40330.99 rows=1 width=8) (actual time=1345.435..1345.435 rows=1 loops=1)
                  ->  Parallel Seq Scan on mv  (cost=0.00..39261.38 rows=427838 width=0) (actual time=0.020..791.022 rows=2567883 loops=1)

新的问题是,为什么有6名工人的计划,但没有启动。否则服务器是空闲的,配置是相同的,查询也是一样的。

端编辑

好的。如果我这么做了呢

代码语言:javascript
运行
AI代码解释
复制
db=> SELECT COUNT(*) FROM mv_pks();
  count
---------
 2567883
(1 row)

Time: 72.687 ms

与不使用EXPLAIN ANALYZE直接在物化视图上计数行的性能相同,但您必须在这里信任我:此函数的性能取决于创建函数时物化视图的状态。这里的快速计时是在表为空时创建函数的结果。如果在表已满时重新创建该函数,则该函数需要超过1000 ms才能运行!

总结我的问题:

  1. 为什么STABLE SQL函数中的SQL查询没有比函数外部的查询慢得多的参数。
  2. 为什么使用EXPLAIN ANALYZE时SQL查询要慢得多?
  3. 为什么在计算函数的行数时得到所有不同的结果,这些函数既可以等效地快速计数物化视图上的行,也可以比任何其他方法慢,这取决于创建函数的时间?

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-03 01:40:27

对于1),您可以使用auto_explain了解自己,它可以显示函数内部查询的计划。它使用平行计划吗?

对于2)这是测量的开销,这取决于平台,但可以是高的。

3)比较两种情况下的SQL计划。SQL函数中的查询没有缓存,因此我没有解释为什么它应该这样运行。您是否多次重复测试以排除从磁盘读取和从缓存读取的效果?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43170330

复制
相关文章
如何使用npm发布自己的npm包
一. 创建 在npm的官网上注册一个账号,https://www.npmjs.com/ 1:在本地通过npm init 初始化一个项目,并建一个index.js 文件,因为index.js为默认进入的文件,如下: 2:在本地将该创建的项目打开,并在index.js编写想要写的文件(这里简单写一个排序),如下: 3:接下来通过npm login来登录你之前创建的npm账号,如下: 4:npm pubish 二. 使用 npm install 包名 三. 版本更新 更改版本号 重新发布
小吕
2022/09/26
3.8K0
如何使用npm发布自己的npm包
如何使用npm发布自己的npm包
一. 创建 在npm的官网上注册一个账号,https://www.npmjs.com/ 1:在本地通过npm init 初始化一个项目,并建一个index.js 文件,因为index.js为默认进入的文件,如下: image-ab2ede5fb9d14ab8bb059eb63257c67c.png 2:在本地将该创建的项目打开,并在index.js编写想要写的文件(这里简单写一个排序),如下: image-1dc4644452b844869943897ce6cfd223.png 3:接下来通过npm
小吕
2022/06/16
1.6K0
如何使用npm发布自己的npm包
卸载npm和安装npm_使用`npm uninstall`卸载npm软件包「建议收藏」
To uninstall a package you have previously installed locally (using npm install <package-name> in the node_modules folder, run
全栈程序员站长
2022/07/25
3.4K0
npm包–rimraf[通俗易懂]
rimraf 包的作用:以包的形式包装rm -rf命令,用来删除文件和文件夹的,不管文件夹是否为空,都可删除
全栈程序员站长
2022/11/17
1.1K0
发布npm包
Npm包管理器不用多讲,用过三大框架的应该都用过。今天讲一下怎么发布自己的npm包。
wade
2020/04/24
6590
关于npm 包更新工具npm-check-updates 使用详解
首先说一下包版本的控制 假设 package.json 的包版本如下 "dependencies": { "vue": "^2.5.0", "vuex": "~3.1.0", "vue-router": "3.5.3", "react": "15.4.x", "typescript": "3.x.x", "react-dom": "*.*.*", "react-draggable": "x.x", "classnames": "x", "pinia": "*" } 执行
用户10106350
2022/10/28
1.4K0
关于npm 包更新工具npm-check-updates 使用详解
为什么不推荐使用PHPicker
iOS 14 中系统新增了一个图片选择器 PHPicker,官方建议使用 PHPicker 来替代原有的 API 进行图片选择,下面我们来看看 PHPicker 的优点:
ios-lan
2020/10/23
2.7K0
为什么不推荐使用PHPicker
MySQL为什么不推荐使用in
当然,每个具体的情况都是不同的,所以在选择查询操作符时,我们需要根据具体的需求和数据情况进行评估和测试。在优化查询性能时,我们可以使用MySQL的查询分析工具来帮助我们理解查询的执行计划和性能瓶颈,从而做出更好的决策。
程序员朱永胜
2023/09/07
4170
使用typescript开发angular模块(发布npm包)
创建模块 初始化package.json文件 执行命名 npm init -y 会自动生成package.json文件如下,name默认为文件夹名称 { "name": "MZC-Ng-Api", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords"
易兒善
2018/08/21
1.3K0
使用typescript开发angular模块(发布npm包)
【工具】发布NPM包
另外:后面会再总结一个系列,就是腾讯项目用到的技术点,有好多好多,可以供大家学习参考,让我们一起进步
神仙朱
2020/07/10
1K0
规范升级 NPM 包
在日常工作中,当组件跨项目使用时,我们往往会选择把组件抽成 npm 包。那么在 npm 开发以及发布的过程中有什么需要注意的事项吗?本文将从我自己的角度,来为大家介绍一下我认为的一些需要大家注意的点。
政采云前端团队
2022/12/01
8350
规范升级 NPM 包
nodejs常用npm包
用户1141560
2017/12/26
2.4K0
如何发布npm包
1、npm是什么? NPM (node package manager),通常称为node包管理器。顾名思义,它的主要功能就是管理node包,包括:安装、卸载、更新、查看、搜索、发布等。 npm 可以让 JavaScript 开发者在共享代码、复用代码以及更新共享的代码上更加方便。 当一个 JavaScript 开发者为了解决某个问题而编写了一些代码并将其共享出来的话,其他的开发者能够在自己的应用程序中复用这些代码,npm 让这些事情变得简单。 如果你使用了其他开发者开发的代码,你就可以很方便地使用 npm
小胖
2018/06/27
1.4K0
为什么 MySQL 不推荐使用 join?
作者:李博 , 链接: https://cnblogs.com/liboware/p/12740901.html
Java小咖秀
2021/04/07
2.2K0
为什么 MySQL 不推荐使用 join?
小程序构建npm---miniprogarm_npm包
接下来在左上角 --工具--构建npm 成功之后就可以看到项目中有了miniprogram_npm文件夹了
安德玛
2022/03/04
1.4K0
为什么不建议使用goto语句
现在老师上课基本上不怎么讲goto语句,很多文章也提到不建议使用,那到底是为什么呢?
用户6755376
2020/04/01
2.4K0
为什么不推荐使用存储过程?
之所以有这个题目,我既不是故意吸引眼球,也不想在本文对存储过程进行教科书般论述。最近项目中遇到的存储过程问题,让我想起了去年在武汉出差时一位同事的发问:
芋道源码
2019/11/29
2.1K0
到底为什么不建议使用SELECT * ?
“不要使用SELECT *”几乎已经成为了使用MySQL的一条金科玉律,就连《阿里Java开发手册》也明确表示不得使用*作为查询的字段列表,更是让这条规则拥有了权威的加持。
蝉沐风
2022/08/22
8370
到底为什么不建议使用SELECT * ?
为什么不建议你使用SELECT *
“不要使用SELECT *”几乎已经成为了MySQL使用的一条金科玉律,就连《阿里Java开发手册》也明确表示不得使用*作为查询的字段列表,更是让这条规则拥有了权威的加持。
蝉沐风
2022/08/05
2.6K2
为什么不建议你使用SELECT *
JSLint,JSHint,ESLint对比
最近在用React写项目,但是我的Vim配置之前并没有配置对JSX和ES6的支持,然后看着那堆报错各种不爽了,于是还是要继续折腾,顺便也增加了点知识,记录一下。
Jintao Zhang
2018/08/27
4K0

相似问题

用文本覆盖旧文本更新DOM节点

12

如果某个特定节点是文本节点,如何使用Xpath选择它?

12

如何从DOM节点获取文本节点?

30

如何检索DOM文本节点的文本?

15

如果我知道节点是< id >,那么如何立即匹配它

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档