PostgreSQL 解释:我如何看待一个计划,就好像某些表有数百万行一样?

PostgreSQL EXPLAIN: How do I see a plan AS IF certain tables had millions of rows?

这是关于 PostgreSQL's EXPLAIN command 的问题。此命令向您展示优化器将如何根据表中的数据执行 SQL。我们还没有投入生产,所以我们所有的表都有大约 100 行或更少。有没有办法让 EXPLAIN 告诉我如果某些表有数百万行而不是几十行,解释计划会是什么样子?

可以以某种方式生成数据,但我必须清除它并等待它被创建。如果这是唯一的方法,我会接受它作为答案。

我不这么认为。 Postgresql 收集一些与 table 相关的统计数据,优化器将使用这些数据来选择最佳计划。这些统计数据与 table 包含的行数无关,但它们也取决于 values/data。

来自 postgres 文档:

the query planner needs to estimate the number of rows retrieved by a query in order to make good choices of query plans.

这是什么意思?假设我们有一个名为 foo 的索引列,没有非唯一约束。假设您有以下简单查询:

SELECT * FROM test_table WHERE foo = 5

Postgresql 将不得不在不同的索引扫描之间进行选择:

  • 顺序扫描
  • 索引扫描
  • 位图扫描

它将根据它认为从查询中检索的行数来选择扫描类型。它如何知道在 运行 查询之前将检索多少行?使用它收集的统计数据。这些统计数据基于您的 table 中的 VALUES/DATA。假设您有一个包含 100 万行的 table,其中 90% 有 foo = 5。 Postgresql 可能知道这一点,因为它可能已经收集了一些关于数据分布的统计信息。所以它会选择顺序扫描,因为按照它的成本模型,这个扫描是最便宜的。

最后,生成数据是不够的,但你应该生成代表现实的值(你将来会有的数据)。

您已经可以构建您的数据库并创建一些索引(基于您将执行的查询)以在生产中获得良好的性能。如果这还不够,您将不得不在 投入生产后 调整索引。