我正在学习DB2,我遇到了这样的子句:OPTIMIZE FOR 1 ROW
紧接在FETCH FIRST 100 ROWS ONLY
之后。
我明白FETCH FIRST 100 ROWS ONLY
会给我前100行符合条件。但我不明白OPTIMIZE FOR 1 ROW
在这里真正做了什么。我读了这个DB2文档,上面写着
使用OPTIMIZE FOR 1 ROW子句影响访问路径。OPTIMIZE FOR 1 ROW告诉Db2选择一个访问路径,快速返回第一个符合条件的行。
而这个DB2文档说的是
一般来说,如果只检索几行,可以指定OPTIMIZE FOR 1 ROW来影响Db2选择的访问路径。
但我还是很困惑。使用OPTIMIZE FOR n ROWS
会使查询更有效吗?
我也发现了这篇关于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
到底是做什么的?谢谢!
使用
OPTIMIZE FOR n ROWS
会使查询更有效吗?
不一定。但是,如果有一个访问计划替代方案可以更快地找到匹配查询条件的第一行,那么它可能会导致应用程序比正常情况下更早地开始接收行,尽管整个查询将因此运行更长时间。
在Db2 for LUW文档中有这样的部分,它给出了特定于该平台的一些示例:
尝试指定
OPTIMIZE FOR n ROWS
和FETCH FIRST n ROWS ONLY
,以鼓励查询访问计划直接从引用表返回行,而不首先执行缓冲操作,例如插入临时表,排序或插入哈希连接哈希表。指定
OPTIMIZE FOR n ROWS
来鼓励避免缓冲操作的查询访问计划,但检索整个结果集的应用程序可能会遇到较差的性能。这是因为如果要检索整个结果集,那么最快返回前n行的查询访问计划可能不是最佳查询访问计划。