我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么解决PostgreSQL窗口函数调用的限制

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么解决PostgreSQL窗口函数调用的限制

这篇文章主要讲解了“怎么解决PostgreSQL窗口函数调用的限制”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么解决PostgreSQL窗口函数调用的限制”吧!

背景

窗口函数是分析场景常用的,目前(citus 7.5)仅支持两种场景使用window函数,

1、partition by 必须是分布键。

2、where条件里面带分布键的等值过滤条件。

本质上:目前(citus 7.5)window函数不支持跨shard操作,或者说过程中不进行重分布。

而Greenplum这方面做得很好,是一个完整的MPP数据库。

citus window函数的支持

postgres=# \set VERBOSITY verbose  
  
  
postgres=# select row_number() over(partition by bid order by aid) rn,* from pgbench_accounts;  
ERROR:  0A000: could not run distributed query because the window function that is used cannot be pushed down  
HINT:  Window functions are supported in two ways.   
Either add an equality filter on the distributed tables' partition column   
or   
use the window functions with a PARTITION BY clause containing the distribution column  
LOCATION:  DeferErrorIfQueryNotSupported, multi_logical_planner.c:938

满足以下条件即可支持

1、partition by 必须是分布键。

2、where条件里面带分布键的等值过滤条件。

postgres=# select row_number() over(partition by bid order by aid) rn,* from pgbench_accounts where aid=1;  
 rn | aid | bid | abalance |                                        filler                                          
----+-----+-----+----------+--------------------------------------------------------------------------------------  
  1 |   1 |   1 |        0 |                                                                                       
(1 row)  
  
postgres=# select row_number() over(partition by aid order by bid) rn,* from pgbench_accounts  limit 1;  
 rn | aid | bid | abalance |                                        filler                                          
----+-----+-----+----------+--------------------------------------------------------------------------------------  
  1 | 298 |   1 |        0 |                                                                                       
(1 row)

执行计划

postgres=# explain verbose select row_number() over(partition by aid order by bid) rn,* from pgbench_accounts  limit 1;  
                                                                       QUERY PLAN                                                                          
---------------------------------------------------------------------------------------------------------------------------------------------------------  
 Limit  (cost=0.00..0.00 rows=0 width=0)  
   Output: remote_scan.rn, remote_scan.aid, remote_scan.bid, remote_scan.abalance, remote_scan.filler  
   ->  Custom Scan (Citus Real-Time)  (cost=0.00..0.00 rows=0 width=0)  
         Output: remote_scan.rn, remote_scan.aid, remote_scan.bid, remote_scan.abalance, remote_scan.filler  
         Task Count: 128  
         Tasks Shown: One of 128  
         ->  Task  
               Node: host=172.24.211.224 port=1921 dbname=postgres  
               ->  Limit  (cost=705.99..706.01 rows=1 width=105)  
                     Output: (row_number() OVER (?)), pgbench_accounts.aid, pgbench_accounts.bid, pgbench_accounts.abalance, pgbench_accounts.filler  
                     ->  WindowAgg  (cost=705.99..860.95 rows=7748 width=105)  
                           Output: row_number() OVER (?), pgbench_accounts.aid, pgbench_accounts.bid, pgbench_accounts.abalance, pgbench_accounts.filler  
                           ->  Sort  (cost=705.99..725.36 rows=7748 width=97)  
                                 Output: pgbench_accounts.aid, pgbench_accounts.bid, pgbench_accounts.abalance, pgbench_accounts.filler  
                                 Sort Key: pgbench_accounts.aid, pgbench_accounts.bid  
                                 ->  Seq Scan on public.pgbench_accounts_106812 pgbench_accounts  (cost=0.00..205.48 rows=7748 width=97)  
                                       Output: pgbench_accounts.aid, pgbench_accounts.bid, pgbench_accounts.abalance, pgbench_accounts.filler  
(17 rows)  
  
postgres=# explain verbose select row_number() over(partition by bid order by aid) rn,* from pgbench_accounts where aid=1;  
                                                                         QUERY PLAN                                                                            
-------------------------------------------------------------------------------------------------------------------------------------------------------------  
 Custom Scan (Citus Router)  (cost=0.00..0.00 rows=0 width=0)  
   Output: remote_scan.rn, remote_scan.aid, remote_scan.bid, remote_scan.abalance, remote_scan.filler  
   Task Count: 1  
   Tasks Shown: All  
   ->  Task  
         Node: host=172.24.211.232 port=1921 dbname=postgres  
         ->  WindowAgg  (cost=2.51..2.53 rows=1 width=105)  
               Output: row_number() OVER (?), aid, bid, abalance, filler  
               ->  Sort  (cost=2.51..2.51 rows=1 width=97)  
                     Output: aid, bid, abalance, filler  
                     Sort Key: pgbench_accounts.bid  
                     ->  Index Scan using pgbench_accounts_pkey_106819 on public.pgbench_accounts_106819 pgbench_accounts  (cost=0.28..2.50 rows=1 width=97)  
                           Output: aid, bid, abalance, filler  
                           Index Cond: (pgbench_accounts.aid = 1)  
(14 rows)

Citus未在window调用中支持重分布的过程。

greenplum window函数的支持

支持任意姿势的window调用

postgres=# create table t(id int, c1 int, c2 int);  
NOTICE:  Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'id' as the Greenplum Database data distribution key for this table.  
HINT:  The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.  
CREATE TABLE  
  
postgres=# insert into t select random()*100000, random()*10, random()*100 from generate_series(1,10000000);  
INSERT 0 10000000  
  
postgres=# explain select row_number() over (partition by c1 order by id) rn,* from t ;  
                                                    QUERY PLAN                                                      
------------------------------------------------------------------------------------------------------------------  
 Gather Motion 33:1  (slice2; segments: 33)  (cost=1477974.88..1553064.94 rows=10012008 width=12)  
   ->  Window  (cost=1477974.88..1553064.94 rows=303395 width=12)  
         Partition By: c1  
         Order By: id  
         ->  Sort  (cost=1477974.88..1503004.90 rows=303395 width=12)  
               Sort Key: c1, id  
               // 以下在citus中用临时表代替  
	       ->  Redistribute Motion 33:33  (slice1; segments: 33)  (cost=0.00..313817.24 rows=303395 width=12)  
                     Hash Key: c1  
                     ->  Seq Scan on t  (cost=0.00..113577.08 rows=303395 width=12)  
 Optimizer status: legacy query optimizer  
(10 rows)

甚至一个SQL中支持多个不同维度的partition

postgres=# explain select row_number() over (partition by c1 order by id) rn1, row_number() over (partition by c2 order by c1) rn2, * from t ;  
                                                                   QUERY PLAN                                                                     
------------------------------------------------------------------------------------------------------------------------------------------------  
 Gather Motion 33:1  (slice3; segments: 33)  (cost=3017582.83..3192792.97 rows=10012008 width=12)  
   ->  Subquery Scan coplan  (cost=3017582.83..3192792.97 rows=303395 width=12)  
         ->  Window  (cost=3017582.83..3092672.89 rows=303395 width=12)  
               Partition By: coplan.c1  
               Order By: coplan.id  
               ->  Sort  (cost=3017582.83..3042612.85 rows=303395 width=12)  
                     Sort Key: coplan.c1, coplan.id  
                     // 以下在citus中用临时表代替  
		     ->  Redistribute Motion 33:33  (slice2; segments: 33)  (cost=1477974.88..1853425.18 rows=303395 width=12)  
                           Hash Key: coplan.c1  
                           ->  Subquery Scan coplan  (cost=1477974.88..1653185.02 rows=303395 width=12)  
                                 ->  Window  (cost=1477974.88..1553064.94 rows=303395 width=12)  
                                       Partition By: t.c2  
                                       Order By: t.c1  
                                       ->  Sort  (cost=1477974.88..1503004.90 rows=303395 width=12)  
                                             Sort Key: t.c2, t.c1  
                                             // 以下在citus中用临时表代替  
					     ->  Redistribute Motion 33:33  (slice1; segments: 33)  (cost=0.00..313817.24 rows=303395 width=12)  
                                                   Hash Key: t.c2  
                                                   ->  Seq Scan on t  (cost=0.00..113577.08 rows=303395 width=12)  
 Optimizer status: legacy query optimizer  
(19 rows)

感谢各位的阅读,以上就是“怎么解决PostgreSQL窗口函数调用的限制”的内容了,经过本文的学习后,相信大家对怎么解决PostgreSQL窗口函数调用的限制这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎么解决PostgreSQL窗口函数调用的限制

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

使用Pandas实现MySQL窗口函数的解决方法

本文主要介绍MySQL中的窗口函数row_number()、lead()/lag()、rank()/dense_rank()、first_value()、count()、sum()如何使用pandas实现,同时二者又有什么区别,感兴趣的朋友一起看看吧
2023-02-22

pycharm无法调用模块函数怎么解决

如果PyCharm无法调用模块函数,可以尝试以下解决方法:确保已正确安装模块:在PyCharm中,打开终端(Terminal),运行`pip show 模块名`命令,查看模块是否已正确安装。如果未安装,可以运行`pip install 模块
2023-10-24

Java循环内的回调函数问题怎么解决

本篇内容介绍了“Java循环内的回调函数问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!问题出现在循环体内的回调函数,用一个很简单
2023-06-04

轻量应用服务器流量限制怎么解决的

轻量应用服务器流量限制可以采用以下方法解决:限制应用访问量:应用服务器使用缓存来保存应用程序运行时的数据,限制每个应用可以最大访问的数据数量。例如,可以限制每个应用可以访问的数据数量,或者可以设置每个应用最大访问量。流量控制:应用服务器可以控制每个应用可以访问的数据量,以此来限制访问量。这种流量控制可以是通过应用服务器的负载均衡或者流量控制算法来实现。限制应用访问频率:应用服务器可以限制
2023-10-26

Vue中使用axios调用后端接口的坑怎么解决

这篇文章主要讲解了“Vue中使用axios调用后端接口的坑怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue中使用axios调用后端接口的坑怎么解决”吧!axios调用后端接口的坑
2023-06-29

golang recover函数使用的坑怎么解决

这篇文章主要讲解了“golang recover函数使用的坑怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“golang recover函数使用的坑怎么解决”吧!一,正常情况下pack
2023-07-05

轻量应用服务器流量限制怎么解决的呢

轻量应用服务器流量限制通常可以采用以下解决方法:限制应用程序访问网络和服务器资源:在应用程序的URL中设置流量限制。如果应用程序必须使用Web服务器,需要将URL中的“HTTP-LIMIT”属性设置为“100”。使用流量监视工具:可以使用流量监视工具来统计应用程序的流量并限制应用程序在网络上的可用带宽。流量监视工具可以监视应用程序在网络上的响应时间、平均延迟等指标。调整应用程序设置:可以
2023-10-26

oracle的nvl函数不起作用怎么解决

如果Oracle的NVL函数不起作用,可能是因为参数传递错误或者函数调用有误。在解决这个问题之前,可以尝试以下几种方法:检查参数传递是否正确:确保传递给NVL函数的参数数量和类型正确。NVL函数接受两个参数,第一个参数是要检查的值,第二个参
oracle的nvl函数不起作用怎么解决
2024-03-05

oracle的to_date函数使用无效怎么解决

如果Oracle的to_date函数使用无效,可能是因为传入的日期格式不正确或者传入的日期字符串不符合特定的格式要求。解决方法包括:检查传入的日期字符串格式是否与to_date函数的格式要求相匹配。确保传入的日期字符串符合特定的格式,如’Y
oracle的to_date函数使用无效怎么解决
2024-04-08

轻量应用服务器流量限制怎么解决的呢苹果

轻量应用服务器流量限制通常可以使用以下方法来解决:限制应用程序使用的HTTP服务器数量:您可以限制应用程序请求到应用服务器的次数。您可以尝试通过应用程序控制面板的HTTP/10000设置来限制应用程序使用的HTTP服务器数量。限制访问受限制的数据库:您可以在HTTP服务器上对访问受限制的数据库进行限制,例如使用应用程序控制面板的CMD命令。限制JavaScript代码片段的流量:Java
2023-10-26

sql中的coalesce函数使用无效怎么解决

如果在SQL中使用COALESCE函数时出现无效的情况,可能是因为参数传递的数据类型不匹配或者参数数量不正确。要解决这个问题,可以按照以下方法进行调整:确保传递给COALESCE函数的参数类型是相同的。如果参数类型不匹配,可以尝试将它们转换
sql中的coalesce函数使用无效怎么解决
2024-04-09

轻量应用服务器流量限制怎么解决的呢苹果13

轻量应用服务器流量限制通常可以使用以下方法来解决:限制应用程序访问网络时间:限制每个应用程序访问网络的时间,可以禁止用户访问指定时段或特定页面的时间。限制每秒访问应用程序的次数:可以禁止用户在一定时间内访问特定页面,或者在应用程序启动时阻止其启动。应用程序防火墙(例如应用程序防火墙):可以限制每台设备在特定时间段内只能访问特定应用程序。应用程序缓存:可以限制每台设备在特定时间段内缓存页
2023-10-26

轻量应用服务器流量限制怎么解决的呢苹果13pro

检查网络连接,确保您连接的网络是稳定的,并且没有其他网络问题;升级您的iOS操作系统到最新版本,确保系统已经升级到最新版本,并且没有任何缓慢的更新问题;检查iCloud中的备份服务是否正常,是否有数据备份,或者是否有其他未使用的备份空间;检查连接网络,确保您连接的网络是稳定的,并且有足够的带宽;检查应用商店中的应用程序是否能够正常运行,避免出现应用商店中无响应的情况;更新应用程序或服务,确保更新后应用程序运行正常,并且...
2023-10-26

轻量应用服务器流量限制怎么解决的呢苹果14pro

如果您的应用程序需要通过应用程序服务器执行大量的轻量应用程序流量限制,您可能需要考虑以下方案:限制应用程序服务器的网络流量:您可以为应用程序服务器设置带宽限制,例如每GB带宽可支持的最大应用程序数量。您还可以限制每个应用程序服务器的流量使用量。应用程序服务器应用程序流量限制器:您可以启用应用程序服务器的应用程序流量限制器,以确保每个应用程序服务器只在特定时间内使用足够的带宽。限制应用程序客户端的网络流量...
2023-10-26

轻量应用服务器流量限制怎么解决的呢苹果14

如果您的应用服务器流量过多导致系统变慢,可以尝试以下解决方法:关闭应用服务器:可以尝试关闭应用服务器的进程和应用程序服务器资源,或者使用自动更新程序来更新应用服务器的资源。限制应用服务器:可以尝试限制应用服务器的CPU使用率和内存使用率,确保它们不会太高。限制应用服务器资源:可以尝试限制应用服务器的CPU使用率和内存使用率,确保它们不会太高。检查应用服务器资源:确保您的应用服务器运行正
2023-10-26

javascript浏览器的窗口被移动时触发此事件使用什么函数,详细讲解

浏览器窗口移动事件处理函数当浏览器窗口移动时,可以使用window.onmousemove事件函数触发事件。该函数接收事件对象,提供窗口移动详细信息,如新位置和移动方向。事件对象中的重要属性包括:clientX和clientY:鼠标在窗口中的坐标。screenX和screenY:鼠标在屏幕中的坐标。movementX和movementY:自上一次移动事件以来的窗口移动距离。通过这些属性,可以处理窗口移动事件,例如调整元素位置或更新界面。
javascript浏览器的窗口被移动时触发此事件使用什么函数,详细讲解
2024-04-02

C语言中sizeof函数使用的坑怎么解决

这篇文章主要介绍“C语言中sizeof函数使用的坑怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言中sizeof函数使用的坑怎么解决”文章能帮助大家解决问题。先来看这样一段代码int m
2023-06-29

编程热搜

目录