sql - 如何理解postgres解释分析?

标签 sql postgresql query-performance sql-execution-plan

我拥有的表数据大约有 200 万行,目前我正在运行的查询只是从表中选择所有数据 (select *)。

这是一个非常天真的查询优化案例,但我想了解的真正意图是解释分析。

这是开启计时的解释分析的输出。

查询计划

 Seq Scan on sample  (cost=0.00..37929.83 rows=2185783 width=26) (actual time=0.065..348.752 rows=2185712 loops=1)
 Planning time: 0.102 ms
 Execution time: 463.020 ms
(3 rows)

因此,最大执行时间为0.3秒。

问题

  • 这个时间估计有多现实?我在 Pgadmin 上运行以在行上执行 select * 并且需要 30 秒。这是有道理的,因为它需要在屏幕上打印出整个数据。但这是否意味着数据库端的优化部分已经完成并且我们通常面临的问题是打印数据
  • 我正在使用 JDBC 打印数据。获取和打印数据大约需要 45 秒。假设 0.3 秒是实际数据库时间,其余时间由 Java 程序打印出来?我在同一系统上运行,因此排除了网络 I/O。

我是数据库优化的新手,我只是想了解如何理解 postgres 中的 explain analyze 以及如何实际估计查询运行时间以及如何确定是否需要在数据库方面进行任何改进?

最佳答案

EXPLAIN ANALYZE 显示的实际时间是真实的。您可以信任它,因为您想要优化数据库执行而不是其他因素,例如 - 在 Java 中提取它,从中创建对象,打印它,IOPS 等。时间也会根据当时在您的计算机上运行的其他进程而有所不同机器。

比较原始计划和优化计划总能给你更现实的见解。

大多数时候查询执行时间是问题所在。其他因素非常标准。

如何决定是否需要查询优化: 如果您的查询计划中有这些东西,那么您的查询很可能需要优化:

  1. 大量循环。
  2. 如果您有堆扫描。
  3. 如果筛选的行数非常多。
  4. 对大表进行顺序扫描。
  5. 您有索引,但规划器没有使用它们。
  6. 大部分查询执行不是通过仅索引或索引扫描。

我使用这两种工具来可视化我的计划:

  1. http://tatiyants.com/pev/#/plans/new
  2. https://explain.depesz.com

关于sql - 如何理解postgres解释分析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32180550/

相关文章:

sql - 简单的查询确实很慢

sql - 如何测试 Redshift View 性能?

sql - 在 SQL Server 中确定百分比协议(protocol)

sql - 统计国际域名长度抛出SQL(PostgreSQL)

sql - 优化 postgresql 更新

postgresql - 将 postgreSql 数据与 ElasticSearch 同步

C# linq order by 和其他带有 foreach 的语句,是否存在性能差异?

mysql - 如何多次加入同一个表?

php - 计算并打印 php mysql 中数据的行数

sql - 当我阅读其他关于此的帖子时,我仍然看不出 GROUP BY 和 ORDER BY 在 SQL 中的区别。它是什么?