[英]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.