gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:44:35 29 4
gpt4 key购买 nike

我正在支持 Grails Web 应用程序,该应用程序使用 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 行结果,而且查询在数据库端运行得非常快,却要花这么长时间?

其他信息:

数据库:FSL1D

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

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

最佳答案

我使用驱动程序 ojdbc7.jar 设置了 Groovy 版本:2.3.6 JVM:1.8.0_11Oracle 12.1.0.2.0 >

注意 10046 trace 的激活在运行之前进行诊断。

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}"

对跟踪的检查显示该语句已被解析并执行,这意味着如果存在 ORDER BY 子句,则所有数据都已排序。

提取大小使用正确,并且提取的记录数不超过所需的记录 - 此处 170 = 150 + 20。如果提取大小为 100,则分两步完成(注意 r 参数 - 提取的行数)。

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

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

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

但识别问题的最佳方法很简单,启用 10046 跟踪并查看发生了什么。我正在使用 level 12这意味着您还可以获得信息 关于数据库中的等待和绑定(bind)变量。

关于grails - Groovy 中的 sql.rows() 运行缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34265842/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com