在优化查询时,所有这些都需要帮助:
有两个表,其字段如下:
表1 AdminId策略位置 表2 AdminId Policy CreateTimestamp Detail1 Detail2 .Detail50
表2是一个大表,会有很多数据。对于Table1中的每个rec,Table2中可能有数千行。需求是从具有location = NY的表2中获取最后一年的统计数据。我写了下面的查询,但它没有优化,我无法运行它。请建议如何优化此查询。提前感谢!
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)发布于 2016-04-06 17:26:14
您应该首先修改查询以使用ANSI样式的显式连接语法,如
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条件中涉及的所有列上创建了一个索引。
发布于 2016-04-06 17:27:51
这可能是你的问题:
and T1.location like ('℅NY℅')在大多数数据库中,这种类型的构造不允许您使用索引,因此查询不能很好地执行。
如果字段中没有多个位置,则删除不必要的通配符。如果有它们,则需要更改数据模型,以便将数据正确地放入相关表中。不要将逗号(或其他分隔符)分隔列表存储在数据库中的字段中。
如果不能更改数据模型,最好的方法是编写一个函数,将数据拆分为某种类型的临时表,然后连接到该表中。在Server中,我建议您通过Google查找fn_split,以了解如何做到这一点。我不太熟悉你如何在DB2中做这样的事情,但在互联网上可能有一个类似的功能。
发布于 2016-04-06 17:40:08
如果选项卡是正确的索引和统计是最新的,这样的简单查询不应导致性能问题。检查计划中是否使用了现有的索引,并且估计是正确的(完全错误的数字可能表示统计问题)。
我对DB2不太了解,您可以尝试将条件移到两个派生表中,但这对一个像样的optmizer来说不会有什么区别:
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.policyhttps://stackoverflow.com/questions/36458041
复制相似问题