【问题标题】:DB2 Optimize for n rowsDB2 优化 n 行
【发布时间】:2021-10-09 22:42:07
【问题描述】:

我正在学习 DB2,并且在 FETCH FIRST 100 ROWS ONLY 之后遇到了这个子句:OPTIMIZE FOR 1 ROW

我知道FETCH FIRST 100 ROWS ONLY 会给我前 100 行符合条件的行。但我不明白OPTIMIZE FOR 1 ROW 在这里真正做什么。我阅读了this DB2 文档,上面写着

使用 OPTIMIZE FOR 1 ROW 子句来影响访问路径。 OPTIMIZE FOR 1 ROW 告诉 Db2 选择快速返回第一个符合条件的行的访问路径。

还有this DB2 文档,上面写着

通常,如果您只检索几行,请指定 OPTIMIZE FOR 1 ROW 以影响 Db2 选择的访问路径。

但我仍然感到困惑。使用OPTIMIZE FOR n ROWS 会提高查询效率吗?

我还发现this post on SO 似乎OPTIMIZE FOR n ROWS 等同于FETCH FIRST n ROWS ONLY 每个接受的答案。

但是当我自己使用OPTIMIZE FOR n ROWS而不是FETCH FIRST n ROWS ONLY进行实验时,结果集并不相同。使用OPTIMIZE FOR n ROWS,查询返回所有符合条件的行。

有人可以向我解释一下OPTIMIZE FOR n ROWS 的真正作用吗?谢谢!

【问题讨论】:

  • 文档文本正确“...选择快速返回第一个符合条件的行的访问路径。”这只是对优化器的提示。返回fetch first n rows only 与功能要求不同。如果你学习db2exfmt的输出或visual-explain来解释访问计划,你可能会通过访问计划中提到的运算符看到影响。
  • @mao 感谢您的评论。我还没有了解访问计划。当我到达那里时,我一定会密切关注。
  • 引擎算子可以分为流水线式和物化式。流水线的不会受到影响,但可以调整实现以快速返回第一行块。但是,从长远来看,这种特殊优化对整个查询来说可能代价高昂。

标签: db2


【解决方案1】:

使用OPTIMIZE FOR n ROWS 会提高查询效率吗?

不一定。但是,它可能会导致您的应用程序比其他情况更早地开始接收行,如果有一个访问计划替代方案可以更快地找到匹配查询条件的第一行,尽管整个查询 因此运行时间会更长。

Db2 for LUW docs 中的这一点给出了特定于该平台的一些示例:

尝试将OPTIMIZE FOR n ROWSFETCH FIRST n ROWS ONLY 一起指定,以鼓励直接从引用表返回行的查询访问计划,而无需先执行缓冲操作,例如插入临时表、排序或插入哈希连接哈希表。

指定OPTIMIZE FOR n ROWS 以鼓励避免缓冲操作的查询访问计划但检索整个结果集的应用程序可能会遇到性能不佳的问题。这是因为如果要检索整个结果集,最快返回前 n 行的查询访问计划可能不是最佳查询访问计划。

【讨论】:

  • "...这是因为如果正在检索整个结果集,那么最快返回前 n 行的查询访问计划可能不是最佳查询访问计划..." -- 确实如此.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-07
  • 1970-01-01
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多