如何加速使用列表作为 WHERE 子句的 PostgreSQL SELECT 函数?

如何解决如何加速使用列表作为 WHERE 子句的 PostgreSQL SELECT 函数?

我有一个 SELECT 函数,它接受 symbol 的参数列表。

CREATE OR REPLACE FUNCTION api.stats(p_stocks text[])
RETURNS TABLE(symbol character,industry text,adj_close money,week52high money,week52low money,marketcap money,pe_ratio int,beta numeric,dividend_yield character)
as $$
SELECT DISTINCT ON (t1.symbol) t1.symbol,t3.industry,cast(t2.adj_close as money),cast(t1.week52high as money),cast(t1.week52low as money),cast(t1.marketcap as money),cast(t1.pe_ratio as int),ROUND(t1.beta,2),to_char(t1.dividend_yield * 100,'99D99%%')
                FROM api.security_stats as t1
                LEFT JOIN api.security_price as t2 USING (symbol) 
                LEFT JOIN api.security as t3 USING (symbol)
                WHERE symbol = any($1) ORDER BY t1.symbol,t2.date DESC
$$ language sql
PARALLEL SAFE;

我试图通过添加索引和其他方法来加速初始查询,它确实将我的查询时间减少了一半的速度,但只有当列表具有 ONE 值时,它仍然很慢,具有多个值。

为简洁起见,我在下面添加了原始的 select 语句,只有一个符号作为参数,AAPL

SELECT DISTINCT ON (t1.symbol) t1.symbol,'99D99%%')
                FROM api.security_stats as t1
                LEFT JOIN api.security_price as t2 USING (symbol)
                LEFT JOIN api.security as t3 USING (symbol)
                WHERE symbol = 'AAPL' ORDER BY t1.symbol,t2.date DESC;

以下是有关性能的详细信息:

                                                                              QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Unique  (cost=71365.86..72083.62 rows=52 width=130) (actual time=828.301..967.263 rows=1 loops=1)
   ->  Sort  (cost=71365.86..72083.62 rows=287101 width=130) (actual time=828.299..946.342 rows=326894 loops=1)
         Sort Key: t2.date DESC
         Sort Method: external merge  Disk: 33920kB
         ->  Hash Right Join  (cost=304.09..25710.44 rows=287101 width=130) (actual time=0.638..627.083 rows=326894 loops=1)
               Hash Cond: ((t2.symbol)::text = (t1.symbol)::text)
               ->  Bitmap Heap Scan on security_price t2  (cost=102.41..16523.31 rows=5417 width=14) (actual time=0.317..2.658 rows=4478 loops=1)
                     Recheck Cond: ((symbol)::text = 'AAPL'::text)
                     Heap Blocks: exact=153
                     ->  Bitmap Index Scan on symbol_price_idx  (cost=0.00..101.06 rows=5417 width=0) (actual time=0.292..0.293 rows=4478 loops=1)
                           Index Cond: ((symbol)::text = 'AAPL'::text)
               ->  Hash  (cost=201.02..201.02 rows=53 width=79) (actual time=0.290..0.295 rows=73 loops=1)
                     Buckets: 1024  Batches: 1  Memory Usage: 17kB
                     ->  Nested Loop Left Join  (cost=4.98..201.02 rows=53 width=79) (actual time=0.062..0.252 rows=73 loops=1)
                           Join Filter: ((t1.symbol)::text = (t3.symbol)::text)
                           ->  Bitmap Heap Scan on security_stats t1  (cost=4.70..191.93 rows=53 width=57) (actual time=0.046..0.195 rows=73 loops=1)
                                 Recheck Cond: ((symbol)::text = 'AAPL'::text)
                                 Heap Blocks: exact=73
                                 ->  Bitmap Index Scan on symbol_stats_idx  (cost=0.00..4.69 rows=53 width=0) (actual time=0.029..0.029 rows=73 loops=1)
                                       Index Cond: ((symbol)::text = 'AAPL'::text)
                           ->  Materialize  (cost=0.28..8.30 rows=1 width=26) (actual time=0.000..0.000 rows=1 loops=73)
                                 ->  Index Scan using symbol_security_idx on security t3  (cost=0.28..8.29 rows=1 width=26) (actual time=0.011..0.011 rows=1 loops=1)
                                       Index Cond: ((symbol)::text = 'AAPL'::text)
 Planning Time: 0.329 ms
 Execution Time: 973.894 ms

现在,我将采用上面相同的 SELECT 语句并将 where 子句更改为 WHERE symbol in ('AAPL','TLSA') 以复制我最初提到的原始 FUNCTION

编辑:这是使用多个值的新测试,当我将 work_mem 更改为 10mb 时:

                                                                      QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------------
 Unique  (cost=253542.02..255477.13 rows=101 width=130) (actual time=5239.415..5560.114 rows=2 loops=1)
   ->  Sort  (cost=253542.02..254509.58 rows=387022 width=130) (actual time=5239.412..5507.122 rows=430439 loops=1)
         Sort Key: t1.symbol,t2.date DESC
         Sort Method: external merge  Disk: 43056kB
         ->  Hash Left Join  (cost=160938.84..191162.40 rows=387022 width=130) (actual time=2558.718..3509.201 rows=430439 loops=1)
               Hash Cond: ((t1.symbol)::text = (t2.symbol)::text)
               ->  Hash Left Join  (cost=50.29..400.99 rows=107 width=79) (actual time=0.617..0.864 rows=112 loops=1)
                     Hash Cond: ((t1.symbol)::text = (t3.symbol)::text)
                     ->  Bitmap Heap Scan on security_stats t1  (cost=9.40..359.81 rows=107 width=57) (actual time=0.051..0.246 rows=112 loops=1)
                           Recheck Cond: ((symbol)::text = ANY ('{AAPL,TSLA}'::text[]))
                           Heap Blocks: exact=112
                           ->  Bitmap Index Scan on symbol_stats_idx  (cost=0.00..9.38 rows=107 width=0) (actual time=0.030..0.031 rows=112 loops=1)
                                 Index Cond: ((symbol)::text = ANY ('{AAPL,TSLA}'::text[]))
                     ->  Hash  (cost=28.73..28.73 rows=973 width=26) (actual time=0.558..0.559 rows=973 loops=1)
                           Buckets: 1024  Batches: 1  Memory Usage: 64kB
                           ->  Seq Scan on security t3  (cost=0.00..28.73 rows=973 width=26) (actual time=0.009..0.274 rows=973 loops=1)
               ->  Hash  (cost=99479.91..99479.91 rows=3532691 width=14) (actual time=2537.403..2537.404 rows=3532691 loops=1)
                     Buckets: 262144  Batches: 32  Memory Usage: 6170kB
                     ->  Seq Scan on security_price t2  (cost=0.00..99479.91 rows=3532691 width=14) (actual time=0.302..1347.778 rows=3532691 loops=1)
 Planning Time: 1.409 ms
 Execution Time: 5569.160 ms

我已通过从原始查询中删除 adj_close 来解决该问题。我的功能现在很快。感谢您帮助我指出查询规划器中的问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res