有关在 db2 中添加索引的建议



美好的一天,

在我的 java Web 应用程序中,我有一个表,它有 107 列,这个表也是一个父表,并且有许多子表。目前,此表的生产记录行超过 1000 万行。

自去年以来,Java Web应用程序不断遇到缓慢的问题。经过检查和调试,我们发现在更新或从此表中选择数据期间发生缓慢。

每次遇到此问题时,我都会使用选择查询或更新查询来运行db2advis命令来检查其结果,并且每次我得到的结果需要改进>99% 才能应用推荐的索引。添加这些索引后,将解决缓慢问题。

所以到目前为止,这个表中已经应用了 7~8 个索引。今天,有人报告我再次出现缓慢问题。检查后,发现在从此表中选择语句并加入其他表期间,它的速度也很慢。同样,我运行db2advis命令并结果也提高了>99%,并且推荐的索引很少。

但是,我开始质疑自己,所有这些解决方案都是一个好的解决方案吗?如果将来有另一个缓慢问题,我应该再次应用相同的解决方案吗?

而且每次我得到db2advis的结果,它还会有一部分未使用的现有索引,即删除索引查询的列表,这些索引就是我之前插入的索引。我相信这是因为这些索引与当前查询无关db2advis?所以我可以忽略这个吗?还是这些现有索引会影响性能?

据我了解,索引也有缺点,特别是对于插入和更新语句。

此外,系统所有者有一项政策,即将数据保留至少 7 年,因此,所有者不会为数据库做内务管理。

想征求意见,除了添加索引,并将查询更改为更好的查询,还有其他方法可以解决此问题吗?

本答案包含有关您可能可用的杠杆的一般建议。

许多公司都会遇到这种情况,这些公司需要遵守多年在线数据保留的法规要求。

当物理数据模型不是为了利用范围分区轻松推出旧数据(不删除(时,性能可能会随着时间的推移而下降,尤其是在业务更改或法律更改影响数据分发时。

你的问题不是关于编程,而是关于性能管理,这是一个很大的话题。

因此,您的问题可能更适合dba.stackexchange.com。这个 stackoverflow 网站旨在解决更具体的编程问题。

始终关注整个工作负载,而不仅仅是单个查询。一个查询的"好解决方案"可能对功能的另一个方面不利。 如前所述,添加一个索引可以加快一个查询的速度,但会对其他插入/更新/删除活动产生负面影响。 拥有相同(或更高(数据量和匹配分布的非生产环境的公司可以利用这样的环境进行性能测量,特别是如果他们有一个真实的测试工作负载生成器和用于分析的仪器。

另外,请记住正确设计统计信息集合的重要性 - 有时列组统计信息可以对帮助索引选择产生很大的影响,即使对于现有索引也是如此,其他时候使用分布统计信息可以极大地帮助动态SQL,而统计信息视图可以帮助解决许多问题。因此,在添加新索引之前,请始终考虑其他类型的技术是否可以提供帮助,特别是如果连接列已经正确索引,并且存在外键索引,但由于某种原因,Db2 优化器忽略了索引。

如果 Db2 索引上次使用列(以syscat.indexes为单位(显示索引从未使用或很少使用,那么您应该调查创建索引的原因,以及为什么某些可能预期从该特定索引中受益的查询忽略了该索引。有时,需要对索引中的列重新排序,以确保选择性最高的列位于最低序号位置。

您还可以调整其他杠杆,MQT,MDC,优化配置文件(提示(,注册表设置,优化级别,但起点是良好的数据模型和良好的测量。

最新更新