2017-08-15 94 views
0

我不知道为什么这个查询运行速度非常慢,如果表有180多万条记录的数据。我连接的数据库是DB2。jdbcTemplate.query运行缓慢,数百万条记录

public CustomerEmailFreq getFreqCodeByEmail(String email, String domain) { 
CustomerEmailFreq customerEmailFreq = new CustomerEmailFreq(); 
Map namedParameters = new HashMap(); 
namedParameters.put("email", email); 
namedParameters.put("domain", domain); 

String sql = "select freq_cde,email_local,email_domain,last_src_date,last_src_time from ADDRESS where upper(email_local)=upper(:email) and upper(email_domain)=upper(:domain) ORDER BY TIMESTAMP(LAST_SRC_DATE,LAST_SRC_TIME) DESC FOR READ ONLY WITH UR FETCH FIRST ROW ONLY"; 

this.jdbcTemplate.query(sql, namedParameters, (rs, rowNum) -> 

{ 
    customerEmailFreq.setEmailDomain(rs.getString("EMAIL_DOMAIN").trim()); 
    customerEmailFreq.setEmailLocal(rs.getString("EMAIL_LOCAL").trim()); 
    customerEmailFreq.setFreqCode(rs.getString("FREQ_CDE")); 
    customerEmailFreq.setLastSrcDate(rs.getString("LAST_SRC_DATE")); 
    customerEmailFreq.setLastSrcTime(rs.getString("LAST_SRC_TIME")); 
    return null; 

}); 
return customerEmailFreq; 

}

任何提示,以帮助这一点。

+1

查询需要多长时间直接在db上运行? 你为什么返回null? –

+0

它需要超过4分钟。因为我已经使用lambda表达式,所以必须返回null。 –

+0

你为什么期望它跑得快? – mustaccio

回答

1

1.8亿行是一些严重的数字。因此,如果不能使用索引来限制数据库中访问的块的数量,那么应该预计它们会运行一段时间。

在评论你的答案

为什么你希望它跑得快的问题?

随着

,因为表的索引是建立在列email_localemail_domain。我在where子句中使用了哪些内容,希望能够更快地运行。

问题是,你最有可能不使用这些索引。

  1. 如果它们实际上是多个索引,数据库很可能只会使用一个。大多数数据库大多数时间不能合并多个索引。

  2. 如果你的where子句看起来是这样的:

    where upper(email_local)=upper(:email) and upper(email_domain)=upper(:domain) 
    

    这意味着你将不能索引列的where子句,而是要发挥基于这些列的结果。这使得索引大多无用。

这里是你可以做什么(可能有更多的,这里不是DB2专家)

  1. add a function based index。这是你真正应该做的。其他更多的情况下,你不能做到这一点(不同的关系数据库管理系统,旧版本,疯狂的数据库管理员)

  2. 添加列与大写的名称到表和索引这些并在查询中使用它们。

  3. 将where子句中的列放上upper。这显然会改变你的查询,可能不会被接受。

  4. 正如你可以添加使用索引约束的最终真的哈克方法:

    where column between lower(:value) and upper(:value) and upper(column) = upper(:value) 
    

    你需要适应这种方法多列,并确保任何非ASCII字符作为排序预计(他们不会)。

在任何情况下,查看您的报表explain plan并在变更前后进行比较是个好主意。如果您使用数亿行,您将需要此工具。

+0

谢谢Jens让我看看 –

相关问题