【问题标题】:How can I learn to make realistic assumptions about database performance?我怎样才能学会对数据库性能做出现实的假设?
【发布时间】:2011-03-13 01:49:36
【问题描述】:

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

但是,我有点犹豫要不要相信他们的话。当我不得不接受它并找到一种不同的方式来获取我想要的信息或学会以这种速度生活时,我可以使用哪些资源来学习,当我可以对 DBA 说废话时。

【问题讨论】:

  • 这是使用 ORM 的折衷方案 - 您可以自行决定它如何构建发送到数据库的查询。 LINQ 是唯一让我感兴趣的,因为您可以将它与存储过程一起用于此类情况。如果您想要更快的速度,DBA 没有告诉您放弃 ORM,我很惊讶......
  • 性能预测真的很难,即使对于经验丰富的开发人员也是如此。如果经验的战斗伤痕还不够(或来得不够快),分析器(包括谦虚的explain)是你的朋友。 :-)

标签: database performance oracle hibernate


【解决方案1】:

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

不容易?也许更好的方法是对 DBA 员工采取更少的对抗方法,并礼貌地询问哪些查询会抑制性能改进,以及他们是否有任何关于如何重构它们以提高性能的建议。

【讨论】:

  • 解释计划是要走的路。它告诉您查询是如何被处理的,以及它期望处理多少数据。您将其与“我需要为此查询处理多少数据”的直觉进行比较。如果它们不同,请询问原因。
  • 一个好的 ORM 通常比普通开发人员做得更好,并且可以进行微调(我认为 Hibernate 也是如此)。
  • @Pascal,我希望如此,否则他们将一文不值。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    发表我的评论作为答案:

    这是使用 ORM 的折衷方案 - 您对它如何构造发送到数据库的查询任其摆布。 LINQ 是唯一让我感兴趣的,因为您可以将它与存储过程一起用于此类情况。如果你想要更快的速度,DBA 没有告诉你放弃 ORM,我很惊讶......

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

    【讨论】:

    • 你认为Hibernate不支持存储过程的原因是什么?提示:确实如此。
    • @Pascal Thivent:抱歉,我不知道每个 ORM 提供什么或我的信息的最新情况。我的信念是大多数人没有使用 ORM 来使用存储过程和函数。
    • 这就是为什么我觉得 “我很惊讶 DBA 没有告诉你如果你想要更快的速度就放弃 ORM”
    • @Pascal Thivent:对不起,如果不区分通过 ORM 使用存储过程,假设情况并非如此。 OP 没有(对我)表明他们正在通过 ORM 使用存储过程。
    【解决方案4】:

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

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

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

    请记住,有些承包商和顾问通过 Oracle 性能调优过得很好。如果这很容易,他们会更穷。但是你当然可以给自己足够的知识来迫使那些讨厌的 DBA 与你进行适当的互动。

    【讨论】:

    • +1 表示自我问责方法。另一个很好的资源是 Tom Kyte 的“专家 Oracle 数据库架构”,尽管它的标题,但它是为开发人员编写的,让他们了解 Oracle 架构以及如何编写有效的应用程序。
    【解决方案5】:

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

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

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

    【讨论】:

    • +1 表示 DBA 视角。我喜欢对 Tom Kyte 的“fast=true”参数的引用——总能从中得到笑声。另一个 Kyte 主义是几乎所有 (80-100%) 性能问题都是应用程序和设计问题,而不是数据库问题。结构不佳的查询、不使用绑定变量等都有贡献。
    猜你喜欢
    • 2016-08-28
    • 1970-01-01
    • 2018-10-26
    • 2017-02-02
    • 2022-01-12
    • 2022-12-08
    • 2022-01-04
    • 2022-08-19
    • 1970-01-01
    相关资源
    最近更新 更多