gpt4 book ai didi

sql - Postgres 最小函数性能

转载 作者:行者123 更新时间:2023-11-29 11:26:51 25 4
gpt4 key购买 nike

我需要 runnerId 的最低值。

这个查询:

SELECT "runnerId" FROM betlog WHERE "marketId" = '107416794' ;

需要 80 毫秒(1968 个结果行)。

这个:

SELECT min("runnerId") FROM betlog WHERE "marketId" = '107416794' ;

需要 1600 毫秒。

有没有更快的方法找到最小值,或者我应该在我的 Java 程序中计算最小值?

"Result  (cost=100.88..100.89 rows=1 width=0)"
" InitPlan 1 (returns $0)"
" -> Limit (cost=0.00..100.88 rows=1 width=9)"
" -> Index Scan using runneridindex on betlog (cost=0.00..410066.33 rows=4065 width=9)"
" Index Cond: ("runnerId" IS NOT NULL)"
" Filter: ("marketId" = 107416794::bigint)"

CREATE INDEX marketidindex
ON betlog
USING btree
("marketId" COLLATE pg_catalog."default");

另一个想法:

SELECT "runnerId" FROM betlog WHERE "marketId" = '107416794' ORDER BY "runnerId" LIMIT 1 >1600ms
SELECT "runnerId" FROM betlog WHERE "marketId" = '107416794' ORDER BY "runnerId" >>100ms

LIMIT 如何减慢查询速度?

最佳答案

您需要的是 multi-column index :

CREATE INDEX betlog_mult_idx ON betlog ("marketId", "runnerId");

如果有兴趣,您可以在 this related question on dba.SE 下找到有关 PostgreSQL 中的多列索引、链接和基准的深入信息。 .

我是怎么算出来的?
在多列索引中,行按索引的第一列(“marketId”)排序(并因此聚集),每个簇依次按索引的第二列排序 - 因此第一行符合条件最小值(“runnerId”)。这使得索引扫描非常快。

关于 LIMIT 减慢查询的悖论效应 - Postgres 查询规划器在那里有一个弱点。常见的解决方法是使用 CTE(在这种情况下不需要)。在这个最近密切相关的问题下找到更多信息:
PostgreSQL query taking too long

关于sql - Postgres 最小函数性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13546336/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com