【问题标题】:Improving performance of native sql query in spring/hibernate applicaiton?提高 spring/hibernate 应用程序中本机 sql 查询的性能?
【发布时间】:2012-10-17 10:56:15
【问题描述】:

我下面有native sql query。我正在使用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 seconds,但在spring 和hibernate 集成应用程序中它需要15 minutes。如何提高性能?

谢谢!

【问题讨论】:

  • 请贴一些代码 sn-p ?

标签: java sql oracle spring hibernate


【解决方案1】:

您有两个内部选择。内部选择总是可能导致性能不佳,因为它可能会阻碍数据库找到最佳搜索策略。

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

你只使用这个选择

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

然后你用休眠方法Query.setMaxResults(50000)Query.setFirstResult(0)替换你的where条件Where Rownumber &lt;= 50000 and rownumber &gt; 0(备注:setFirstResult(0)是多余的,因为第0行总是第一个,但我猜你也想得到接下来 50000 行,然后你可以使用 setFirstResult(n))。

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

P。 S:我无法告诉你为什么你的选择在 SQL 开发人员中比在 Hibernate 中快得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    相关资源
    最近更新 更多