Database Hibernate中的本机查询性能

Database Hibernate中的本机查询性能,database,hibernate,jpa,Database,Hibernate,Jpa,很明显,hql查询比本机查询慢。脑海中有一个项目将使用大量的小事务来执行。所以问题是什么会表现得更好: jpa中的本机查询 通过jdbc的本机查询 差别有多大?因为jpa映射功能和准备好的语句更喜欢它。但根据性能要求,hibernate可能不够快 编辑 将“需要处理的大量数据”替换为“需要执行的大量小型事务” 你提供的信息太少了 需要处理的数据量巨大 那有多大?比如说1000万条只有100G的记录 您计划如何处理这些数据?如果您通过Hibernate(或本机查询或jdbc)将其拉到Java

很明显,hql查询比本机查询慢。脑海中有一个项目将使用大量的小事务来执行。所以问题是什么会表现得更好:

  • jpa中的本机查询
  • 通过jdbc的本机查询
差别有多大?因为jpa映射功能和准备好的语句更喜欢它。但根据性能要求,hibernate可能不够快

编辑

  • 将“需要处理的大量数据”替换为“需要执行的大量小型事务”
  • 你提供的信息太少了

    需要处理的数据量巨大
    • 那有多大?比如说1000万条只有100G的记录

    • 您计划如何处理这些数据?如果您通过Hibernate(或本机查询或jdbc)将其拉到Java端,那么您可能走错了方向。您应将数据保存在数据库中,并使用数据库提供的工具在数据库中进行处理,并且光年的性能比任何客户端处理都高。考虑数据库侧处理(Oracle的PL/SQL、MS SQL Server的Transact-SQL)。
    • 您计划优化什么?数据插入?数据检索?您是否计划使用select语句来挖掘大量数据?然后考虑OLAP解决方案的经典OLTP。OLAP解决方案是为商业智能和通过一些巧妙的技巧分析巨大的千兆字节数据而构建的。Google for it(OLAP、决策多维数据集)

    • 您可以使用底层SQL引擎的任何功能吗?例如,如果您使用的是Oracle,那么您可以使用的功能比Hibernate中实际使用的功能多1000倍。例如,您只是无法在Hibernate中进行Oracle文本查询,而且确实有很多事情您无法完成

    我可以总结一下,使用本机SQL和HQL之间的性能差异并不是很大。相反:

    • Hibernate的强大功能在于:只处理很少的数据记录,优化地将其本地缓存在Java端,作为为无法进行数据处理的数据库构建的数据处理系统的基础。(但仅适用于某些选择、插入、更新和删除)
    • 一旦您确实必须移动大量数据,Java端处理就不是一个选项。80年代的程序员正是因为这个原因才发明了存储过程。选择一个支持数据库端处理的数据库,以缩短所有网络往返,并在java代码中使用for循环进行命令式数据处理。而是尽可能多地使用声明式SQL,并在数据库上运行处理
    • 一旦您准备开始使用数据库的功能,Hibernate将成为您的主要障碍。它实际上是作为一个ORM包装器构建的——然而,数据处理问题并非一直都是CRUD和ORM问题。例如,Hibernate对于OLAP用例并不太有用
    巨额小额交易 在有大量小事务(向数据库插入/更新数据)的情况下,Hibernate没有任何性能优势(因为不能使用Java端缓存),而不考虑正在使用的数据库。不过,您可能更喜欢hibernate,因为它是将Java对象转换为SQL语句的好工具

    但是使用Hibernate,您完全无法控制正在发生的事情。例如,Hibernate+Oracle,将新实体插入数据库:这是你能想象到的最糟糕的性能噩梦

    Hibernate就是这样做的:

    • 从序列中选择一个新id
    • 执行一次插入
    • 重复无数次
    这是非常不好的表现。(序列引用应为insert语句的一部分,整个insert语句应使用JDBC批处理。)

    我发现在这个特定的用例中,基于JDBC的方法的运行速度比Hibernate快1000倍。(预取下100个序列,对Oracle使用JDBC批处理模式,将变量绑定到批处理,以100个为一批发送记录,并使用异步提交(这也是Hibernate中无法控制的)


    我发现,如果我想挤出你的大多数工具,我需要深入学习它们。不幸的是,你可以找到很多基于观点的评论,特别是在网络上的Hibernate与非Hibernate战争中。大多数评论都是由Java开发人员编写的,他们根本不知道幕后会发生什么。因此,不要相信-度量:)

    我不是数据库专家,我在寻找一些关于在哪里查找以及应该查找什么的提示。谢谢但还有一件事。如果我转换一些有问题的词语,告诉你我需要执行大量的小交易。在这种情况下,什么会更好?问题已更新。首先查找JDBC批处理模式,然后检查数据库是否允许异步提交()。注意在每100或1000条记录之后实际提交一次,否则您将填充回滚段(从您的角度看,这看起来像是数据库减速)。