DB2 中涉及会话表的选择查询执行缓慢

Posted

技术标签:

【中文标题】DB2 中涉及会话表的选择查询执行缓慢【英文标题】:A select query involving session table in DB2 performs slow 【发布时间】:2014-08-12 03:35:40 【问题描述】:

我在 DB2 中使用 java 创建了一个临时表,然后插入了大约 2000 行。 现在我在一个很少连接的选择查询中使用这个表。该查询涉及其他 3 个表,例如 A、B 和 C。不知何故,此选择查询返回结果非常慢,几乎需要 20 秒才能提供结果。

以下是此查询的详细信息,

    表 A 有 200000 条记录。 B 和 C 只有 100-200 条记录。 所有这 3 个表都在 join 和 where 子句中涉及的列上定义了足够的索引。解释计划工具等没有显示任何需要的新索引。 当我运行查询删除会话表及其在 where 子句中的使用时,查询以毫秒为单位返回结果。正如我提到的,这个会话表只有大约 2000 条记录。 我还在此会话表的每一列上声明了索引。 我不太确定这里的术语,但是当我说会话表时,它是一个使用数据库连接创建的临时表,当数据库连接关闭时,该表会被删除。此外,当程序以 15 个线程运行时,没有线程能够查看其他线程创建的表。

问题可能出在哪里?请在这里告诉我一些建议。

【问题讨论】:

我认为如果您将临时表创建为具有 2000 行的普通表,您的查询也将需要 20 秒。但是如果你对表运行stats,结果可能会有所不同。那么你可以通过比较这些查询计划得到答案。 我认为我们需要查看表定义以及查询。解释计划也很好。您可能正在执行笛卡尔连接(无条件),这会为您提供 很多 行,这可能会很慢。并不总是使用索引,这取决于语句的选择性(选择的行的百分比)或表的大小(小表加载到内存中)。 嗨,我又尝试了一件事。我创建了一个类似于上述问题中提到的会话表的表,然后插入相同数量的行并执行选择查询。结果本身在几毫秒内就出来了。这意味着只有在涉及会话表时才需要时间。此外,当我创建一个表时,我只是创建了它,没有定义任何索引或没有执行 runstat。会话表肯定有问题,我无法理解。 【参考方案1】:

一些建议(我假设是 LUW,因为你没有提到平台)

a) 你说你的会话表的每一列都有索引,我假设这意味着一组 1 列索引。这在大多数情况下不是最优的,您可能可以用复合索引替换那些。通过创建一个真实的表格来检查 advis 的建议,例如:

创建表 temp.t ( ... ) 插入 temp.t (...) 值 (...) 在带有分布的 temp.t 上运行统计数据

然后运行:db2advis -d -m I -s "您的查询,但使用 temp.t 而不是会话表"

b) 加载数据并最终创建新索引后,对会话表执行 runstats

【讨论】:

嗨,我又尝试了一件事。我创建了一个类似于上述问题中提到的会话表的表,然后插入相同数量的行并执行选择查询。结果本身在几毫秒内就出来了。这意味着只有在涉及会话表时才需要时间。此外,当我创建一个表时,我只是创建了它,没有定义任何索引或没有执行 runstat。会话表肯定有问题,我无法理解。 你试过 db2advis 了吗?

以上是关于DB2 中涉及会话表的选择查询执行缓慢的主要内容,如果未能解决你的问题,请参考以下文章

在 postgres 上缓慢选择不同的查询

异步选择 db2

使用用户定义函数作为表的 DB2 查询结构

尽管阻塞会话为 0,但 SQL 查询正在阻塞另一个查询

MySQL系列- MySQL执行计划

MySQL系列- MySQL执行计划