【问题标题】:Coldfusion ORM Large TablesColdfusion ORM 大表
【发布时间】:2009-08-20 01:06:13
【问题描述】:

假设我有一个大型数据集,该表有超过一百万条记录,并且数据库已标准化,因此存在外键和其他内容。我已经正确设置了关系,我得到了第一个对象applications = EntityLoad("entityName") 的列表,但是由于关系和内容,页面需要大约 24 秒才能加载,即使我将要显示的记录数限制为 5 也需要加载时间太长了。

我对此的解决方案是创建另一个仅获取列表的对象,然后当用户想要时,使用具有所有关系的对象并将其显示给用户。这是处理它的正确方法,还是我错过了一个重要的 ORM 概念?

【问题讨论】:

    标签: orm coldfusion


    【解决方案1】:

    您是在计算获取数据的时间,还是在对其进行 CFDUMP 或其他视觉上可能会很慢的操作。换句话说,您是否将 EntityLoad 本身包装在 cftimer 标记中以确保它是罪魁祸首?

    【讨论】:

    • Ray 这就是问题所在,我正在 cfdumping 这个东西,它并没有延迟加载任何东西!。谢谢绝地大师!
    【解决方案2】:

    我要做的第一件事是在 Application.cfc 中启用 SQL 日志记录。将 logSQL=true 添加到 This.ormSettings。

    这应该允许您获取 ORM 生成的 SQL。在分析仪中运行它。看看 ORM SQL 是否在做一些疯狂的事情。看看是不是你漏掉的索引什么的。

    您是否也像 Ray 所说的那样进行寻呼:http://www.coldfusionjedi.com/index.cfm/2009/8/14/Simple-ColdFusion-9-ORM-Paging-Demo

    如果您没有尝试使用 ORMExecuteQuery 和 HQL 来启用分页。

    这是我的想法。

    【讨论】:

      【解决方案3】:

      使用 Hibernate 定义复杂的域模型时 - 您有时需要调整映射以提高性能。如果您正在处理继承(不确定模型中有多少继承),则尤其如此。最终目标是让您的查询从尽可能少的表中提取,同时仍然保留您的域模型。这可能需要使用高级继承映射(稍后会详细介绍)。

      记录 SQL

      正如 Terry 所提到的,您需要确保可以记录传递到数据库的实际 SQL(是的,使用 ORM 并不能完全摆脱 SQL)。这是一篇很棒的文章,介绍了 Rupesh 在 CF9 中为 Hibernate 设置日志记录:

      http://www.rupeshk.org/blog/index.php/2009/07/coldfusion-orm-how-to-log-sql/

      休眠映射文件

      当您想要做一些超出基本的事情时,您需要确保查看的是为您的 CFC 生成的实际 Hibernate 映射文件。请务必使用 Application.cfc 中的所有休眠选项设置以下内容:

      savemapping = true
      

      虽然 cfproperty 属性允许您定义映射的许多方面,但实际上有些事情只能在 Hibernate 映射文件中完成(并且有大量的社区资源。

      继承映射

      正如我之前提到的,Hibernate 为映射提供了不同的继承策略。它们是每个层次结构的表、每个子类的表、每个具体类的表和隐式多态性。您可以在 Advanced Mapping > Inheritance Mapping 下的 CF9 文档或 Hibernate 文档中阅读有关这些类型的更多信息(因为解释每一个都需要很长时间)。

      了解表的映射方式对于继承非常重要(如果您不调整设置,Hibernate 也可以在其中生成一些巨大的查询)。

      这些是我能想到的——如果你能提供一些关于你的领域模型的额外信息——我们可以看看可以做些什么来调整它。

      【讨论】:

        【解决方案4】:

        Hibernate 很有可能正在做它的缓存工作。在我看来,一个公平的比较(请大家随意添加)正在做一个:

        EntityLoad("entity_name") 与执行 select * from TABLE

        相同

        因此,在这种情况下,Hibernate 在实例化内存并以某种方式缓存它时可能会做什么,当您发送如此广泛的 SQL 指令时,您的数据库服务器可能会类似地执行此操作。

        过去几周我对 ORM 非常感兴趣,它看起来是一项非常有益的事业。

        出于这个原因,您是否会加载所有 500,000 条记录?我假设不是。

        我有一个要攻击的大型日志记录表,我发现 SQL 好东西必须在那里。例如,将作为索引的字段标记为这样,这将在搜索时加快速度。我相信 ORM 可以处理这个问题。

        除此之外:

        • 查找一些优秀的 Hibernate 论坛、资源和教程,以便您学习 Hibernate。这实际上并不是一个 Coldfusion --> ORM 问题,而是 Hibernate 自己可能会做的事情。我已经订购了几本 Hibernate 书籍,我正在等着看它们怎么样。
        • 同样,似乎有大量的 Hibernate 资源,您可以将 Hibernate 的性能增强解决方案带入 Coldfusion 领域。我可能把它写得太简单了,但我认为 CF-ORM 实现是一个带有一些代码生成的包装器,可以节省我们的时间。
        • 看看在 EntityLoad() 调用中实现过滤器以减少数据。
        • 按照其他线程中的建议,打开 sql 日志记录并查看正在生成的 sql。它可能不是您所需要的。查看 HQL,看看您是否可以形成更好的陈述。
        • 最重要的是,分享您的发现。我会自愿在这方面做同样的事情,因为你诱使我比计划早一点在业余时间尝试一下。

        【讨论】:

          【解决方案5】:

          Faisal,我们在 Linq (c# orm) 中遇到了这个问题。

          我们的解决方案是创建不包含关系数据的简单对象。例如,除了 Users 之外,我们还有一个 SimpleUsers 对象,它与任何其他对象几乎没有关系或没有任何关系,并且有一组有限的列。

          可能有其他方法来处理这个问题,但这种方法极大地提高了查询速度。

          【讨论】:

          • 感谢约翰的分享,这听起来很有帮助。
          • 无汗贾斯。我相信 CF 应该在最终版本中使用懒惰=真,但现在我猜测试版还没有完全出炉。 :-)
          猜你喜欢
          • 2010-11-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-16
          • 2011-08-15
          • 2011-09-04
          相关资源
          最近更新 更多