【发布时间】:2022-01-06 23:28:21
【问题描述】:
GCP 上的 Postgres 12。 包含大约 700 万行并且还在不断增长的表。
select Distinct col1, col2
from tab_a
where col3='abc'
and col4='xyz'
order by col2
limit 5;
使用 Distinct 此查询大约需要 2.1 到 2.8 秒 没有 Distinct 需要 0.25 秒,但我的表根据业务需求得到了重复数据。
我是否可以在没有昂贵的 Distinct 子句的情况下获得前 5 个唯一记录? 我可以执行以下操作,但它不是可靠的解决方案:
select Distinct
col1, col2
from (
select col1, col2
from tab_a
where col3='abc'
and col4='xyz'
order by col2
limit 50
)
limit 5;
有人可以指导我一个更强大的解决方案吗?
愿望
【问题讨论】:
-
这次在表上有索引还是没有索引。表有索引吗?
-
首先评论:在您的初始查询中,您限制为 5 个结果行,而仅在 col2 上排序,这意味着您将获得 5 行具有任意 col1 值的行,因为它们没有在 col1 上排序。那么你可以在有和没有
DISTINCT子句的查询上执行EXPLAIN ANALYSE吗?通常这是代价高昂的ORDER BY子句。 -
您没有向我们提供足够的信息来确定时间花在哪里。您还给了我们一个替代版本(尽管正如您所说,它不是一个强大的版本),但没有提到它的速度有多快。选项卡 a 上是否有处理
col3和col4的索引?它是否还包括col2(可能还有col1?)表中有多少行与col3和col4上的WHERE匹配?这些平均有多少不同的col1和col2?等等等等......正如@EdouardH所提到的。 ,请使用 EXPLAIN ANALYZE 运行您的查询,以便我们可以处理。 -
欢迎来到 Stack Overflow。您使用的用户名与经常回答 SQL 问题的 longtime contributor 相同。也许你最好使用另一个名字。
-
很抱歉没有提供完整信息@O.Jones 我已经更改了名称(感谢您告诉我)详细信息如下:索引在那里并且查询使用索引。第一个查询解释计划(有不同)ibb.co/DKyj1xn 第一个查询解释计划(没有不同)ibb.co/3Tpq9zX 我可以以某种方式比较输出行并继续获取行,直到顶部唯一的 5 行到达没有“不同”?在我的情况下,即使前 100 名在毫秒内返回,也没有不同
标签: postgresql performance query-optimization distinct