【发布时间】:2023-03-30 12:50:01
【问题描述】:
SELECT T.id_task,
T.group,
A.type
FROM TASK T
JOIN ACTION A ON T.id_task = A.id_task
WHERE T.dt_inc BETWEEN 1511146800000 AND 1511492399999
AND A.dt_scheduled BETWEEN 1511146800000 AND 1511492399999
AND A.id_action > ( SELECT MIN(id_action) FROM ACTION WHERE T.id_task = id_task AND type <> 'TRANSFER' )
原来的查询要大得多,但有问题的部分就在这里。
仅使用 (task.dt_inc, action.dt_scheduled) 需要一分钟,但是如果我 DROP INDEX action_dt_scheduled,执行时间会下降到一秒,仅使用 (task) 的结果相同.dt_inc, action.id_task ) 索引。
- 为什么索引的表现如此糟糕?
- 我可以忽略这个索引而不删除它吗?
我重新创建了索引 DROP > CREATE,我使 REINDEX wath 应该与重新创建相同,我现在该怎么办?
编辑:
我试图得到慢查询的解释,但这不再慢了,表的 ANALYZE 和 REINDEX 已经解决了这个问题。
【问题讨论】:
-
定义、描述、统计、解释分析。顺便说一句:
> ( SELECT MIN(id_action) FROM...看起来很可疑(但是:取决于数据的分布)这些1511146800000数字实际上是时间戳? -
请Edit您的问题并为有问题的表(包括所有索引)添加
create table语句以及使用explain (analyze, verbose, buffers)生成的执行计划。 Formatted text 请no screen shots -
@a_horse_with_no_name,我会得到关于这个问题的所有原始资料(表、索引、查询),但我需要一些时间,现在可以做
标签: sql postgresql performance