当前位置: 首页 > 知识库问答 >
问题:

提高spring/冬眠应用程序中本机sql查询的性能?

苍意智
2023-03-14

下面是本机sql查询。我使用的是Oracle数据库。

select
         * 
     from
         (select
             row_.*,
             rownum rownumber 
         from
             (select
                 colmn1,
                 colmn2,
                 colmn3,
                 colmn4,
                 colmn5,
                 colmn6,
                 from
                 Table5
             where
                 colmn5 In (
                    '19901','10001'
                 ) 
             order by
                colmn1 ) row_ ) 
         Where
             Rownumber <= 50000
             and rownumber > 0

上面的查询返回50000记录。如果在SQLDeveloper中执行上述查询,只需30秒;但在spring和hibernate集成应用程序中,只需15分钟。我怎样才能提高性能?

谢谢!

共有1个答案

雷献
2023-03-14

你有两个内在的选择。内部选择总是可能导致性能下降,因为它可能阻碍数据库找到最优的搜索策略。

据我所知,您只使用内部选择来处理行号。如果您只使用最内部的select并在Java/休眠级别处理行号,那么您将获得更好的性能。

您只使用此选择

select colmn1, colmn2, colmn3, colmn4, colmn5, colmn6,
   from Table5
   where colmn5 In ('19901','10001') 
   order by colmn1

因为它没有任何数据库特性,所以可以更容易地被HQL语句替换,从而使您的程序独立于所使用的数据库(Java类和属性名应该被真实的替换):

from Table5_Class
   where colmn5_Prop in ('19901','10001') 
   order by colmn1_prop

然后,您将where条件where Rownumber<=50000和Rownumber>0替换为hibernate方法query.setmaxresults(50000)query.setFirstResult(0)(注意:setFirstResult(0)是多余的,因为第0行总是第一行,但我猜您还希望获得下一个50000行,然后可以使用setFirstResult(n))。

如果需要rownumber作为参数,那么可以使用结果列表的索引。

附:我不能告诉你为什么SQL developer中的select比Hibernate中的select要快得多。

 类似资料:
  • 我正在数据库中运行以下查询: 它输出500行,其中只有一个结果列,运行大约需要1分钟43秒。输出以下计划: 逻辑是:对于每个选择的(在500个id的列表中)计算整数列,返回该金额与数字2147483647之间的较小值。结果必须包含500行,每个id对应一行,我们已经知道它们将与子查询中的至少一行匹配,因此不会生成空值。 索引仅是上的一个b树,属于整数类型。索引是主键上的b树,也是整数类型。表中的每

  • 我使用注释和注释执行查询,并从数据库表中删除记录。 错误: xxx的例外。xxx。xx,原因='javax。坚持不懈TransactionRequiredException:执行更新/删除查询“和异常=”执行更新/删除查询;嵌套的异常是javax。坚持不懈TransactionRequiredException:执行更新/删除查询'

  • 问题内容: 我正在使用 PostgreSQL ,而我的SQL查询有一个奇怪的问题。 根据使用的最晚日期参数 。我的请求没有执行相同的操作。 这是我的工作查询: 该查询大约需要2秒的时间(对我来说这是可以的,因为我有很多行)。当我为此查询运行EXPLAIN ANALYZE时,我有以下内容: 现在,当我在当前月份尝试相同的查询( 我们是4月6日,因此我试图获取所有April的application_i

  • 我正在用JPA创建一个EJB应用程序。我创建了EJBBean,它在实体管理器中使用@PersistenceContext。我还提供了持久化中的设置。包含Hibernate信息的xml文件。我试图使用transaction type=JTA,并试图使用JNDI访问数据源。我还在服务器上提供了一些信息。Websphere Liberty的xml文件 但是,我收到了一条错误消息- javax。ejb。E

  • 问题内容: 我想按数据库中的条件计数记录数。 我尝试使用下一个查询 但是没有方法可以执行此操作并获得结果。 我知道,我可以使用 所以问题是,查询是否具有更高的性能?如果,那么如何执行查询呢? 问题答案: 您可以通过调用来执行第一个查询,例如。 如果要将计数分配给变量,则需要将其转换为适当的类型(它可以取决于DB,但很可能是Long)。第二个查询效率很低,因为Hibernate需要从数据库中检索整个

  • 这是财产, 编译过程中会抛出此错误, 原因:org.hibernate.tool.schema.spi.SchemaManagementException:模式验证:在表[产品]中的列[描述]中遇到错误的列类型;找到[long text(类型#LONGVARCHAR)],但期望[varchar(255)(类型#VARCHAR)] 我错过了什么?