gpt4 book ai didi

postgresql - 匹配文本字段不是空字符串时查询非常慢

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

我有一个非常简单的查询,本质上是这样的:

Select * from my_table Where my_field != '';

表中大约有 40,000 行,“my_field”列是一个文本字段 (varchar 255)

查询大约需要 39,000 毫秒才能运行。我猜是因为它必须查看每条记录以查找非空字符串的内容。我已经为 my_field 列编制了索引,但它没有任何改变。

以防万一,这里是查询计划:

"Seq Scan on my_table  (cost=0.00..3468.91 rows=39744 width=459)"
" Filter: ((my_field)::text <> ''::text)"

我最好的选择是什么?

解释分析:

"Seq Scan on my_table  (cost=0.00..3468.91 rows=39730 width=459) (actual time=0.021..13.763 rows=39714 loops=1)"
" Filter: ((my_field)::text <> ''::text)"
"Total runtime: 14.856 ms"

我添加了这些索引

CREATE INDEX aa_idx ON my_table(my_field);
CREATE INDEX aa_idx ON my_table(my_field) WHERE my_field <> '';

这是 Postgres 9.1

编辑:[2013-02-26 00:04GMT]

在“my_field”上创建一个分区作为检查约束有什么好处吗?

类似于 CHECK(my_field = '') 和分区 2 CHECK(my_field != '')

我猜我所拥有的只是一张包含很多行的表格?但这是否意味着即使分区包含大约 80% 的数据,select != '' 查询也会执行得更快?

我还研究了全文搜索,但这似乎是一个 OTT。我还考虑过将列设置为 0 或 1 的整数( bool 值),但这对性能没有影响(我猜是因为 = 1 仍然会返回很多行?)

最佳答案

索引帮不了你。我认为您需要找到一种更好的方法来合并您的删除。

您说运行需要 39 秒,但您提供的实际查询计划需要 15 毫秒才能运行,这大约减少了 2000 倍。我无法想象缓存会有多大帮助的情况,除非我们谈论的是具有大量 TOASTed 值的非常宽的表。这告诉我实际问题不在您的选择中,而是在您管道的其他地方。这可能包括往返费用,以及您执行删除的方式。

我的建议是查看报表合并。这将意味着避免往返,并将尽可能多的逻辑推送到单个查询中。由于您还没有发布完整的上下文,我建议您可能需要研究可写的 CTE,以便在没有往返的情况下一起批量插入、更新和删除。

关于postgresql - 匹配文本字段不是空字符串时查询非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15057990/

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