微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用变量过滤器更快地进行 PostgreSQL 查询

如何解决使用变量过滤器更快地进行 PostgreSQL 查询

所以我有以下查询

WITH temp_table as (
  SELECT *,ROW_NUMBER() OVER (ORDER BY id ASC) AS rownum 
  FROM table 
  WHERE name = ? 
    AND bool_value != True 
  ORDER BY ?
) 
SELECT * 
FROM temp_table 
WHERE column1 = ? 
 and column2 = ? 
 and column3 = ?

查询通常会返回大约 100k+ 行,但需要大约 20 秒才能完成。我想尽量减少这个时间。该名称将因执行查询用户而异。 'WHERE column1 = ? and column2 = ? and column3 = ?' 部分将根据用户想要检查的内容而有所不同;用户甚至可能不需要任何过滤器:

SELECT *,ROW_NUMBER() OVER (ORDER BY id ASC) AS rownum 
FROM table 
WHERE name = ? 
AND bool_value != True 
ORDER BY ?

用户也可以按不同的值对数据进行排序。

我尝试建立索引,但无法找出正确的索引来加快此查询的速度。还有另一个查询非常慢:

SELECT * 
FROM table 
WHERE bool_value = True 
WHERE column1 = ? 
  and column2 = ?
 and column 3 = ?
ORDER BY ?

查询最多可返回 60k 行,用户无需输入任何过滤器,但需要大约 10-20 秒才能完成。

解决方法

首先,CTE 中的 order by 没有帮助(不保证 Postgres 遵循它),我建议将 CTE 写为:

SELECT t.*,ROW_NUMBER() OVER (ORDER BY id ASC) AS rownum 
FROM table t
WHERE t.name = ? AND bool_value = False ;

注意:这里假设 bool_value 永远不会NULL

然后,对于此查询,您需要一个索引:(name,bool_value,id)

我认为您对外部查询无能为力。

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