sql - PostgreSQL解释: How do I see a plan AS IF certain tables had millions of rows?

标签 sql postgresql sql-execution-plan explain

这是一个关于 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/

相关文章:

sql - 从 SQL Server 自动提取日期 - T-SQL

MySQL:如果表 B 中存在记录,则返回表 A 的所有行和 true|false

mysql - 如何根据先前的值更新列?

mysql - SQL 查询错误 : 'doesn' t know columnName' in Where clause

java - Postgres 中的 Bad Integer 2147483649(其 BIGINT 值)错误

postgresql - 尝试在 docker 文件中创建 postgis 会出现错误

sql - Postgres 中带有 pg_trgm 的相似函数

即席 SQL 与函数的 PostgreSQL 性能

database - SQL Developer 解释计划中断