假设我有一个包含 5000 万条记录的查询结果集。添加 FETCH FIRST 100 ROWS ONLY 子句是否会限制查询构建 5000 万条记录的结果集?比如查询只会构建100条记录的结果集并返回?或者查询是否仍然需要构建一个包含 5000 万条记录的结果集,然后只返回其中的前 50 行?
只是想了解使用 FECTH 子句的机制。
如果您查看执行计划,您会注意到引擎通常会尝试选择流水线运算符,而不是具体化运算符。此规则也有例外,但您通常会看到查询的少数部分(如果有)被具体化。
现在,当执行计划中的某个步骤实现结果时,这意味着该步骤中处理了所有 5000 万行。即使下一步只需要 100 行,上一步已经完成了巨大的工作。
另一方面,如果执行计划中的一个步骤是“管道化”的,那么从概念上讲,每一行都被一个步骤消耗并生成下一个步骤,“一次一个”(至少在概念上)。这意味着,如果操作符 #1 正在读取 5000 万行,然后操作符 #2 限制为 100 行,那么操作符 #2 将通知操作符 #1 其作业已完成,即使仍有 49,999,900 行去。这意味着,流水线运算符 #1 实际上是短路,并在第 100 行之后停止。 简而言之,在检查下一步之前,物化总是会产生全部成本,而流水线则不会。