这是一个关于 PostgreSQL's EXPLAIN command 的问题。此命令向您展示优化器如何根据表中的数据执行 SQL。我们还没有投入生产,所以我们所有的表都有大约 100 行或更少。有没有办法让 EXPLAIN 告诉我如果某些表有数百万行而不是数十行,解释计划会是什么样子?
我可以以某种方式生成数据,但随后我必须清除它并等待它被创建。如果这是唯一的方法,我会接受它作为答案。
最佳答案
我不这么认为。 Postgresql 收集一些与表相关的统计信息,优化器将使用这些统计信息来选择最佳计划。这些统计信息与表包含的行数无关,但它们也取决于值/数据。
来自 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 必须在不同的索引扫描之间进行选择:
- 顺序扫描
- 索引扫描
- 位图扫描
它将根据它认为要从查询中检索的行数来选择扫描类型。它如何知道在运行查询之前将检索多少行?通过它收集的统计数据。这些统计信息基于表内的值/数据。假设您有一个包含 100 万行的表,其中 90% 的行包含 foo = 5
。 Postgresql 可能知道这一点,因为它可以收集一些有关数据分布的统计信息。所以它会选择顺序扫描,因为根据它的成本模型,这种扫描是最便宜的。
最终,仅生成数据是不够的,但您应该生成代表现实的值(您将来将拥有的数据)。
您已经可以构建数据库,创建一些索引(基于您将执行的查询),以便在生产中获得良好的性能。如果这还不够,您将不得不在投入生产后调整索引。
关于sql - PostgreSQL解释: How do I see a plan AS IF certain tables had millions of rows?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69576519/