繁体   English   中英

DB2查询优化

[英]DB2 Query optimization

全部,需要帮助来优化查询:

有两个带有以下字段的表:

表1 AdminId策略Locationid CreateTimestamp

表2 AdminId策略CreateTimestamp Detail1 Detail2。 细节50

表2是一个大表,将包含大量数据。 对于表1中的每个记录,表2中可以有数千行。 要求是从表2中获得位置为NY的最近一年的计数数据。 我在下面编写了查询,但是它没有经过优化,因此无法运行。 请提出如何优化此查询的建议。 提前致谢!

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)

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

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条件中涉及的所有列上都创建了索引。

这可能是您的问题:

and T1.location like ('℅NY℅')

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

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

如果您无法更改数据模型,则最好的办法是编写一个函数,将数据拆分为某种类型的临时表,然后再联接到该临时表中。 在Sql Server中,我建议您通过Google查找fn_split,以获取有关如何执行此操作的想法。 我不熟悉如何在DB2中进行此类操作,但是可能从Internet开始就有类似的功能在浮动。

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

我对DB2不太了解,您可以尝试将条件移到两个派生表中,但这对于像样的优化器来说应该没有什么不同:

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

表格1:

AdminId | Policy | LocationId | CreateTimestamp

表2:

AdminId | Policy | CreateTimestamp | Detail1 | Detail2 | ... | Detail50

我认为您的查询将是:

SELECT COUNT(*)
FROM Table2 AS T2
INNER JOIN Table1 AS T1 ON T2.AdminId = T1.AdminId AND T2.Policy = T1.Policy
WHERE T1.Location LIKE ('%NY%') AND T2.CreateTimestamp > DATEADD(year,-1,GETDATE())

您仍然希望将带有通配符的LIKE放在WHERE子句中,并且可以使用DATEADD(year,-1,GETDATE())与您的时间戳进行比较,以查看记录是否在去年创建。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM