【发布时间】: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