【发布时间】:2012-09-01 01:54:01
【问题描述】:
我的应用程序在 Hibernate 中使用 JPA,我看到 hibernate 在我的日志文件中生成了一些有趣的 SQL 查询,其中包含很多连接。该应用程序现在没有很多用户,我担心当数据库规模增长时,hibernate 生成的一些查询会导致问题。
我已经通过 EXPLAIN 命令运行了一些由 hibernate 生成的 sql 查询,以查看生成的查询计划。
EXPLAIN 的输出是否取决于数据库的大小?当我的数据库变大时,查询计划器会为相同的 SQL 查询生成不同的计划吗?
我应该在开发/部署周期的哪个阶段查看由 hibernate 生成的 sql 查询的 SQL 查询计划?什么时候使用 EXPLAIN 合适。
当数据库非常小以至于每个查询(无论看起来多么复杂)都在 0.5 秒内运行时,如何使用 explain 的输出来确定查询是否会成为问题?
我使用 Postgres 9.1 作为我的应用程序的数据库,但我对上述问题的一般答案很感兴趣。
【问题讨论】:
-
智能数据库使用统计来帮助对如何创建计划做出有根据的猜测。这些统计数据可能会随着新数据的变化而变化。确切的范围、收集、提示等是非常特定于数据库的。但是,这 [很可能] 现在不用担心 :) 只需专注于创建一个干净的模型。
-
@pst 那么这是否意味着当数据库仍然很小时使用解释是没有意义的。
-
请注意,对于早于即将发布的 9.2 的 PostgreSQL 版本,您应该
PREPARE一个语句然后EXPLAIN EXECUTE它以匹配 Hibernate 将如何执行您的语句。在 9.1 及以下版本中,prepared- 和 non-prepared 语句中的查询计划可能不同。 -
@pst:在具有基于成本的优化器(如 PostgreSQL)的数据库中,用于其中行数很少的表的索引不一定与行数很多时相同它。随着表格的增长,计划者可能会选择非常不同的计划。
标签: mysql sql sql-server oracle postgresql