ams*_*ams 7 mysql sql sql-server oracle postgresql
我的应用程序使用JPA和Hibernate,我看到hibernate生成了一些有趣的SQL查询,我的日志文件中有很多连接.该应用程序现在没有很多用户,我担心hibernate生成的一些查询会在数据库大小增加时引起问题.
我已经通过EXPLAIN命令运行了hibernate生成的一些sql查询来查看生成的查询计划.
EXPLAIN的输出是否依赖于数据库的大小?当我的数据库大小增加时,查询规划器会为相同的SQL查询生成不同的计划吗?
在开发/部署周期的哪个阶段我应该查看由hibernate生成的SQL查询的SQL查询计划?什么时候使用EXPLAIN.
当数据库如此之小以至于每个查询无论在0.5秒内运行的复杂程度如何时,如何使用解释的输出来确定查询是否会成为问题?
我使用Postgres 9.1作为我的应用程序的数据库,但我对上述问题的一般答案感兴趣.
实际上,@你在评论中是对的 - 使用带有少量数据的解释通常是没有意义的.
如果一个表只有10行,那么它很可能全部在一个页面中,并且(大致)读取一行的成本与所有10相同.首先进入索引然后获取页面将比阅读该批次更昂贵并忽略你不想要的东西.PostgreSQL的计划程序已经为索引读取,表读取,磁盘访问与缓存访问,排序等内容配置了成本.它根据表的(近似)大小和其中值的分布来确定这些成本的大小.它没有做什么(截至9.2版本)是跨列或跨表相关的原因.它也不提供允许您覆盖计划程序选择的手动提示(与MS-SQL或Oracle不同).
每个RDBMS的规划器都有不同的优点和缺点,但我认为可以说MySQL是最弱的(特别是在旧版本中).
所以 - 如果你想知道你的系统将如何执行100个并发用户和数十亿行,你将需要生成测试数据并加载相当大的一部分.更糟糕的是,您也希望获得大致相同的值分布.如果大多数客户有大约10张发票,但有少数有1000张,那么您的测试数据需要反映出来.如果您需要在多个RDBMS之间保持性能,则在所有RDBMS上重复测试.
这当然与系统的整体性能分开,这取决于服务器的大小和功能与所需的负载.系统可以应对负载的稳定增加,然后突然您会看到性能随着缓存大小的超出而迅速下降等.
HTH
1 EXPLAIN 的输出是否取决于数据库的大小?当我的数据库大小增长时,查询规划器是否会为相同的 SQL 查询生成不同的计划?
这一切都取决于您的数据和有关数据的统计数据。当有人忘记分析或关闭 auto_vacuum(包括分析)时,由于缺乏统计数据,会出现许多性能问题。
2 我应该在开发/部署周期的哪个阶段查看 Hibernate 生成的 SQL 查询的 SQL 查询计划?什么时候是使用 EXPLAIN 的合适时机。
Hibernate 习惯于向数据库发送大量查询,即使是简单的连接。打开你的查询日志,并密切关注该日志。稍后,您可以对日志中的所有查询运行自动解释。
3 当数据库很小以至于每个查询(无论看起来多么复杂)运行时间都在 0.5 秒以内时,如何使用解释的输出来确定查询是否会成为问题?
不,因为这一切都取决于数据。当 95% 的用户是男性时,搜索男性时将不会使用性别索引。当你在寻找女性时,这个索引是有意义的并且会被使用。对性别 = 女性的记录建立功能索引甚至更好:对永远不会从索引中受益的内容建立索引是没有用的,而且索引会小得多。
要预测索引的使用情况,您唯一可以做的就是进行测试,set enable_seqscan = off;这将表明可以使用某些索引,但仅此而已。