0
|
Fabien Snauwaert · 技术社区 · 5 年前 |
![]() |
1
1
这里的根本问题是所谓的中止早期查询计划。以下是pgsql黑客的一条线索,描述了类似的情况: https://www.postgresql.org/message-id/541A2335.3060100%40agliodbs.com
在您的例子中,计划器认为,如果它只是开始遍历done desc排序的行(low,使用review_done索引),它将快速找到4行clicker_id=28。由于行需要按“完成”降序返回,它认为这将保存排序步骤,并且比检索clicker 28的所有行然后进行排序要快。考虑到实际的行分布,结果往往不是这样,这要求它在找到clicker=28的4之前跳过大量的行。 CTE (在9.6中,这仍然是一个优化界限-这在第12页中有所改变,仅供参考)获取没有order by的行,然后在外部查询中添加orderby。考虑到为用户获取所有行、对它们进行排序并返回所需的行数对数据集来说是完全合理的(即使7k行的单击器也不应该是问题),您可以通过在CTE中没有ORDER by或LIMIT来防止计划员认为中止早期计划将是最快的,并提供如下查询:
|