首页 > 其他分享 >pg distinct 改写递归优化(德哥的思路)

pg distinct 改写递归优化(德哥的思路)

时间:2024-03-11 23:25:24浏览次数:21  
标签:德哥 rows .. distinct tt cost pg loops col

德哥的优化思路巨牛逼,这种递归思维真的太吊了,我目前就缺递归思路。

 

下面SQL1000W行数据,列的选择性很低,只有两个值('1'和'11')都是字符串类型,'1'只有一条数据,'11'有9999999行数据。

慢SQL:

select distinct col from tt;

                                                      QUERY PLAN                                                      
----------------------------------------------------------------------------------------------------------------------
 HashAggregate  (cost=169247.11..169247.12 rows=1 width=3) (actual time=5082.733..5082.735 rows=2 loops=1)
   Group Key: col
   ->  Seq Scan on tt  (cost=0.00..144247.29 rows=9999929 width=3) (actual time=0.005..275.906 rows=10000000 loops=1)
 Planning Time: 0.365 ms
 Execution Time: 5082.772 ms
(5 行记录)

CTE递归优化:

WITH RECURSIVE t AS (
   (SELECT col FROM tt ORDER BY col LIMIT 1)  
   UNION ALL
   SELECT (SELECT col FROM tt WHERE col > t.col ORDER BY col LIMIT 1)
   FROM t
   WHERE t.col IS NOT NULL
   )
SELECT col FROM t WHERE col IS NOT NULL;

                                                                        QUERY PLAN                                                                        
----------------------------------------------------------------------------------------------------------------------------------------------------------
 CTE Scan on t  (cost=50.84..52.86 rows=100 width=38) (actual time=0.024..0.079 rows=2 loops=1)
   Filter: (col IS NOT NULL)
   Rows Removed by Filter: 1
   CTE t
     ->  Recursive Union  (cost=0.43..50.84 rows=101 width=38) (actual time=0.022..0.076 rows=3 loops=1)
           ->  Limit  (cost=0.43..0.46 rows=1 width=3) (actual time=0.021..0.021 rows=1 loops=1)
                 ->  Index Only Scan using idx_1_2_tt on tt tt_1  (cost=0.43..260443.37 rows=9999929 width=3) (actual time=0.020..0.020 rows=1 loops=1)
                       Heap Fetches: 0
           ->  WorkTable Scan on t t_1  (cost=0.00..4.84 rows=10 width=38) (actual time=0.017..0.017 rows=1 loops=3)
                 Filter: (col IS NOT NULL)
                 Rows Removed by Filter: 0
                 SubPlan 1
                   ->  Limit  (cost=0.43..0.46 rows=1 width=3) (actual time=0.024..0.024 rows=0 loops=2)
                         ->  Index Only Scan using idx_1_2_tt on tt  (cost=0.43..95149.36 rows=3333310 width=3) (actual time=0.024..0.024 rows=0 loops=2)
                               Index Cond: (col > (t_1.col)::text)
                               Heap Fetches: 0
 Planning Time: 0.096 ms
 Execution Time: 0.096 ms
(18 行记录)

 

里面的逻辑是:

(SELECT col FROM tt ORDER BY col LIMIT 1)

  根节点通过order by 升序 找到最小的一条数据作为起点。

 

递归查询:

SELECT (SELECT col FROM tt WHERE col > t.col ORDER BY col LIMIT 1)
FROM t
WHERE t.col IS NOT NULL

  在第一次迭代中,CTE t 包含值'1'。这个查询将在tt表中寻找col大于'1'的最小值。在数据集中,这将是'11'。

  在第二次迭代,CTE t 将包含'11'。此时,查询将尝试找到大于'11'的最小值,但没有这样的值,所以返回NULL。

 

递归结束:
  当递归查询返回NULL时,递归结束。这时,CTE t 将包含'1'和'11',返回和distinct 一样逻辑的数据。

 

理解了整个逻辑后我都吓尿了,就一道算法题,确实要跟巨佬学习才行,加深递归思维。

 

标签:德哥,rows,..,distinct,tt,cost,pg,loops,col
From: https://www.cnblogs.com/yuzhijian/p/18067341

相关文章

  • 提高性能、减小尺寸的1SG250HU3F50E3VG、1SG250HN3F43I3VG、1SG250HN3F43E2VG高性能 S
    概述英特尔®Stratix®10GXFPGA包含多达1020万个LE。它们在单独的收发器块上配备多达96个通用收发器,可提供2666MbpsDDR4外部内存接口性能。这些收发器可提供高达28.3Gbps的短距离和跨背板传输。这些设备针对需要最高收发器带宽和核心结构性能的FPGA应用而优化......
  • 技术笔记(5)MMORPG
    技术笔记(5)MMORPG希望实现的功能或目标:搞定UI系统搞定人物选择系统‍学习笔记:RawImage在登陆界面中负责将某些特定模型渲染出来,比如:人物、怪物UIMask是可以拦截穿透的,即点击上层覆盖的UI界面时,下层是点不到的UISystem类字典:privateDictionary<string,Ba......
  • DataX批量增量同步pg库表数据
    批量pg2pg增量同步DataX.json配置文件:pg2pg_increment_sync.json{"job":{"setting":{"speed":{"channel":1}},"content":[{......
  • XILINX FPGA 1/4/8通道PCIe DMA控制器IP,高性能版本IP介绍应用
    Multi-ChannelPCIeQDMA&RDMAIP1   介绍基于PCIExpressIntegratedBlock,Multi-ChannelPCIeQDMASubsystem实现了使用DMA地址队列的独立多通道、高性能Continous或ScatherGatherDMA,提供FIFO/AXI4-Stream用户接口。基于PCIExpressIntegratedBlock,Multi-ChannelPC......
  • FPGA的DAC转换部分遇到的问题
    利用线性序列机根据时序图和手册中的输出值的对应关系。DAC这边的知识基本相同。在验证的时候发现了问题,反推仿真的时候发现了,子啊lsm_cnt线性序列机计数的33到了之后还有一位,发现是set_en的问题,因为set_en使能才能计数。这边是正确的波形图和代码对应always@(posedgeclko......
  • 试着写一下MMORPG游戏游戏的自动挂机
    因为,视频里教到了植物大战僵尸的自动放置Call就结束了,所以暂且先跟着视频走。而视频就开始研究mmorpg游戏了。所以我打算跟着视频走。而上个项目大体能够理解其实就是用CE找基址,然后通过代码注入的方式实行自动脚本之类的东东。至于CE找基址OD找call这些设计经验的东西我会慢慢......
  • 基于肤色模型和中值滤波的手部检测算法FPGA实现,包括tb测试文件和MATLAB辅助验证
    1.算法运行效果图预览RTL图:   仿真图:   导入到matlab显示效果如下:   2.算法运行软件版本matlab2022a vivado2019.2 3.算法理论概述      在计算机视觉领域,基于肤色模型和中值滤波的手部检测方法是一种常见的初步定位策略。该方法主要分为......
  • pgAdmin4的安装
    apt安装PostgreSql以后,没有自带的图形化管理工具,所以安装pgAdmin4并尝试连接。pgAdmin4下载网址:https://www.pgadmin.org/download我选择的是APT安装方式,然后有如下代码提示:##Setuptherepository##公钥下载,我下载的时候会提示是否覆盖,要选-是#Installthepublickeyf......
  • FPGA Develop Note ——— RAM
    FPGADevelopNote———RAMRAM的英文全称是RandomAccessMemory,即随机存取存储器,简称随机存储器。它可以随时把数据写入任一指定地址的存储单元,也可以随时从任一指定地址的存储单元中读出数据,其读写速度是由时钟频率决定的。TypesRAM类型特性说明数据读写口数量地......
  • 技术笔记(4)MMORPG开发
    技术笔记(4)MMORPG开发希望实现的功能或目标:框架搭建UI系统‍学习笔记:Rules文件夹CanGetLayersExtensionCanSendCommandExtensionEventExtensionIBelongToArchitectureICanGetModelICanGetSystemICanGetUtilityICanRegistAndUnRegistEventICanSendCommand......