Grails Groovy中的sql.rows()运行缓慢

Grails Groovy中的sql.rows()运行缓慢,grails,groovy,Grails,Groovy,我支持一个GrailsWeb应用程序,它使用AmCharts为客户端显示不同的视觉效果。其中一个选项卡上有三个图表,每个图表根据不同的度量返回数据库中的前十行,因此只有十行。完成这项工作需要4-5个小时,有时甚至更长的时间。查询在数据库上运行不到10秒 调用以下服务方法以返回结果: List fetchTopPages(params, Map querySettings, String orderClause) { if(!((params['country'] && p

我支持一个GrailsWeb应用程序,它使用AmCharts为客户端显示不同的视觉效果。其中一个选项卡上有三个图表,每个图表根据不同的度量返回数据库中的前十行,因此只有十行。完成这项工作需要4-5个小时,有时甚至更长的时间。查询在数据库上运行不到10秒

调用以下服务方法以返回结果:

List fetchTopPages(params, Map querySettings, String orderClause) {
    if(!((params['country'] && params['country'].size() > 0) || (params['brand'] && params['brand'].size() > 0) || (params['url'] && params['url'].size() > 0))) {
        throw new RuntimeException('Filters country or brand or url not selected.')
    }
    Sql sql = new Sql(dataSource)
    sql.withStatement { stmt -> stmt.fetchSize = 100 }
    Map filterParams = acquisitionService.getDateFilters(params, querySettings)
    ParamUtils.addWhereArgs(params, filterParams)
    String query = "This is where the query is"

    ParamUtils.saveQueryInRequest(ParamUtils.prettyPrintQuery(query, filterParams))
    log.debug("engagement pageviews-by-source query: " + ParamUtils.prettyPrintQuery(query, filterParams))
    List rows = sql.rows(query, filterParams)
    rows

}
经过一些调查,很明显,
List rows=sql.rows(query,filterParams)
行占用了这个加载时间

以前有人解释过这个问题吗?为什么sql.rows()只返回10行结果,而查询在数据库端运行得非常快,却要花这么长时间

其他信息:

DB:FSL1D

在数据库端运行以下命令:
java-jar ojdbc5.jar-getversion
返回: “Oracle 11.2.0.3.0 JDBC 3.0于2013年7月11日星期四用JDK5编译 默认连接属性资源 美国东部时间2015年12月16日星期三08:18:32“

Groovy版本:2.3.7 Grails版本:2.4.41
JDK:1.7.0

我用
Groovy版本:2.3.6 JVM:1.8.0_11
Oracle12.1.0.2.0
使用驱动程序
ojdbc7.jar

注意在运行前激活以允许诊断

import oracle.jdbc.pool.OracleDataSource

def ods = new OracleDataSource();
ods.setURL('url')
ods.setUser('usr')
ods.setPassword('pwd')

def con = ods.getConnection()
def sql = new groovy.sql.Sql(con)
sql.withStatement { stmt -> stmt.fetchSize = 100 }
def SQL_QUERY = """select id, col1  from table1 order by id"""
def offset = 150
def maxRows = 20
// activate trace 10046
con.createStatement().execute "alter session set events '10046 trace name context forever, level 12'"

def t = System.currentTimeMillis()
def rows = sql.rows(SQL_QUERY, offset, maxRows)
println "time1 : ${System.currentTimeMillis()-t} with offset ${offset} and maxRows ${maxRows}"
对跟踪的检查显示stament被解析并执行,这意味着如果存在orderby子句,所有数据都将被排序

取数大小使用正确,取数不超过所需的记录-此处170=150+20。 对于fetch size 100,此操作分两步完成(注意
r
参数-获取的行数)

因此,基本上我看到的唯一问题是“跳过的”数据通过网络传递给客户端(在那里被忽略)

这可能会产生非常高的开销(并且与以交互方式运行同一查询生成第一页相比,需要更多的时间)

但识别问题的最佳方法很简单,即启用10046跟踪并查看发生了什么。我在用电话 这意味着你也能得到信息
关于数据库和绑定变量中的等待。

要获得更具体的答案,请发布您的数据库,JDBC驱动程序和Groovy+JDK版本DB:FSL1D在数据库端运行以下命令:
java-jar-ojdbc5.jar-getversion
返回:Oracle 11.2.0.3.0 JDBC 3.0在7月11日星期四用JDK5编译的JDBC 3.0\u PDT\u 2013\f3默认连接属性资源\f3 12月16日08:18:32 EST 2015 Groovy版本:2.3.7 Grails版本:2.4.41 JDK:1.7.0谢谢,我将尝试设置您的场景。有一个类似的问题,但没有一个明确的答案。非常感谢!是的,我调查这个问题已经很长时间了,但正如你所说,没有确定的答案。
FETCH #627590664:c=0,e=155,p=0,cr=5,cu=0,mis=0,r=100,dep=0,og=1,plh=1169613780,tim=3898349818398
FETCH #627590664:c=0,e=46,p=0,cr=0,cu=0,mis=0,r=70,dep=0,og=1,plh=1169613780,tim=3898349851458