首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DB2查询优化

DB2查询优化
EN

Stack Overflow用户
提问于 2016-04-06 17:19:36
回答 4查看 250关注 0票数 0

在优化查询时,所有这些都需要帮助:

有两个表,其字段如下:

表1 AdminId策略位置 表2 AdminId Policy CreateTimestamp Detail1 Detail2 .Detail50

表2是一个大表,会有很多数据。对于Table1中的每个rec,Table2中可能有数千行。需求是从具有location = NY的表2中获取最后一年的统计数据。我写了下面的查询,但它没有优化,我无法运行它。请建议如何优化此查询。提前感谢!

代码语言:javascript
复制
Select count(*) from Table2 T2 , Table1 T1 where T1.adminId = T2.adminId and 
T1.policy = T2.policy and T1.location like ('℅NY℅') and 
T2.createTimestamp > ( current Timestamp - 1 year)
EN

回答 4

Stack Overflow用户

发布于 2016-04-06 17:26:14

您应该首先修改查询以使用ANSI样式的显式连接语法,如

代码语言:javascript
复制
Select count(*) from Table2 T2 
JOIN Table1 T1 
ON T1.adminId = T2.adminId 
and T1.policy = T2.policy 
where T1.location like ('℅NY℅') 
and T2.createTimestamp > ( current Timestamp - 1 year)

还要确保在两个表的JOIN ON条件和WHERE条件中涉及的所有列上创建了一个索引。

票数 0
EN

Stack Overflow用户

发布于 2016-04-06 17:27:51

这可能是你的问题:

代码语言:javascript
复制
and T1.location like ('℅NY℅')

在大多数数据库中,这种类型的构造不允许您使用索引,因此查询不能很好地执行。

如果字段中没有多个位置,则删除不必要的通配符。如果有它们,则需要更改数据模型,以便将数据正确地放入相关表中。不要将逗号(或其他分隔符)分隔列表存储在数据库中的字段中。

如果不能更改数据模型,最好的方法是编写一个函数,将数据拆分为某种类型的临时表,然后连接到该表中。在Server中,我建议您通过Google查找fn_split,以了解如何做到这一点。我不太熟悉你如何在DB2中做这样的事情,但在互联网上可能有一个类似的功能。

票数 0
EN

Stack Overflow用户

发布于 2016-04-06 17:40:08

如果选项卡是正确的索引和统计是最新的,这样的简单查询不应导致性能问题。检查计划中是否使用了现有的索引,并且估计是正确的(完全错误的数字可能表示统计问题)。

我对DB2不太了解,您可以尝试将条件移到两个派生表中,但这对一个像样的optmizer来说不会有什么区别:

代码语言:javascript
复制
Select count(*) 
from
 (
   select adminId, policy
   from Table1
   where T1.location like ('℅NY℅') -- probably T1.location = '℅NY℅'
 ) T1 
join
 (
   select adminId, policy
   from Table2
   where createTimestamp > ( current Timestamp - 1 year)
 ) T2
ON T1.adminId = T2.adminId 
and T1.policy = T2.policy
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36458041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档