我怎样才能学会对数据库性能做出现实的假设?

时间:2010-07-07 22:13:19

标签: database performance oracle hibernate

我主要是一名使用Hibernate的Java开发人员,在我的一些用例中,我的查询执行速度与我的预期相比非常缓慢。我已经与当地的DBA进行了交谈,在很多情况下,由于查询的性质,他们声称性能无法提高。

然而,我有点犹豫要不要接受他们的话。我可以用什么资源来学习,当我不得不吮吸它并找到一种不同的方式来获取我想要的信息或学会以速度生活,以及何时可以在DBA上调用废话。

5 个答案:

答案 0 :(得分:10)

你正处在一个有趣的时刻。大多数Java开发人员使用ORM工具是因为他们对数据库一无所知,他们不想学习任何有关数据库的知识,特别是他们不想学习任何有关特定专有DBMS特性的知识。 ORM表面上可以保护我们免受这一切。

但是,如果您真的想了解查询应该如何执行,那么您将不得不了解Oracle数据库的工作原理。这是一件好事:如果您使用数据库,您肯定会构建更好的Hibernate应用程序。

Oracle的文档集包括性能调优的卷。这是开始的地方。 Find out more。正如其他人所说,入门级工具是EXPLAIN PLAN。另一个重要的读物是Oracle的Database Concepts Guide。调优的一个重要方面是理解数据库的逻辑和物理架构。我也同意DCooke对Tom Kyte的书的推荐。

请记住,有一些承包商和顾问可以通过Oracle性能调优来实现良好的生活。如果这很容易,他们就会变得更穷。但你当然可以给自己足够的知识,迫使那些讨厌的DBA正确地与你交往。

答案 1 :(得分:7)

DCookie,OMG和APC的回答都是+1。我一直在Hibernate应用程序的DBA方面,正如Tom Kyte所说,没有“fast = true”参数可以使效率低下的SQL并使其运行得更快。偶尔我能够捕获有问题的Hibernate查询并使用Oracle SQL分析器为该语句生成一个SQL Profile,以提高性能。此配置文件是一组提示,它们“拦截”优化程序生成的执行计划,并将其强制(不对应用程序进行更改)为优化程序通常会由于某种原因而忽略的优化程序。尽管如此,这些发现仍然是例外,而不是表现不佳的SQL。

作为一个可能比ORM层更好地理解数据的开发人员,你可以做的一件事就是编写有效的视图来解决特定的查询问题并将这些视图呈现给Hibernate。

需要注意的一个非常具体的问题是Oracle DATE(而不是TIMESTAMP)列,这些列最终出现在Hibernate生成的查询中,并与WHERE子句中的绑定变量进行比较 - 与Java时间戳数据类型不匹配将阻止在这些列上使用索引。

答案 2 :(得分:4)

您的查询效果预期的基础是什么?直觉?如果你要与DBA争论,你需要知道(至少)你的查询是什么,理解EXPLAIN PLAN,并能够指出如何改进。并且,正如@OMG Ponies指出的那样,Hibernate可能在构建查询方面做得很差 - 那你做什么?

不容易?或许更好的方法是与DBA工作人员采取一些不那么对抗的方法,并礼貌地询问抑制性能改进的查询是什么,以及是否有任何关于如何重构它们以更好地执行的建议。

答案 3 :(得分:4)

发表评论作为答案:

  

这是使用ORM的权衡 - 你对它如何构造发送到数据库的查询感到怜悯。 LINQ是唯一让我感兴趣的人,因为你可以将它与存储过程一起用于这种情况。如果你想要更好的速度,我很惊讶DBA不会告诉你放弃ORM ......

EXPLAIN计划将让您了解效率,但不是真正的速度观点。对于Oracle,您需要使用tkprof(假设您可以使用)来分析正在发生的事情。

答案 4 :(得分:0)

它也可能是表结构(规范化)问题。大多数情况下,这正是我不使用hybernate的原因 - 你应该始终能够编写自己的最佳查询。

相关问题