请不要理会我为什么这样写这个查询的原因,这不是问题的主题,因为这是一个从现实世界的例子中派生出来的假设。
我有一个案例,我需要通过分页检索记录:每页只有9条记录。
我有一个子查询,它从users表中检索所有行(> 10,000行),在信封查询中,我应用分页,如下所示:
select *
from
(select firstname, lastname, age
from users) -- returns > 10,000 rows
order by lastname asc
offset 0 rows fetch next 9 rows only现在,请再次忽略它为什么是这样写的,我的问题是更多地理解Server如何优化查询: Server是否实际运行子查询,然后返回整个结果集,然后将其过滤到前9行,这当然会对性能产生负面影响,或者,它是否以某种方式优化了它,这样它就不必返回整个结果集,如果没有子查询,就会产生相同的性能吗?
我重写了这个查询,以便更直接,如下所示:
select firstname, lastname, age
from users
order by lastname asc
offset 0 rows fetch next 9 rows only然而,令我惊讶的是,我并没有注意到性能有那么大的提高,这让我想到也许SQL Server在幕后是自己的优化吗?
有人有线索吗?
发布于 2020-01-20 13:26:15
SQL是一种描述性语言,而不是一种过程语言。SQL查询描述正在生成的结果。它没有指定如何计算这些结果。
这是编译器和优化器的功能。实际上,执行的代码与原始SQL语句完全不一样。从技术上讲,它被称为DAG (有向无圈图)。它使用了一堆你无法识别的原始运算符。通常很难找到原始查询中与特定操作符匹配的内容。
当Server执行查询时,将对整个查询进行优化。Server有一个很好的优化器,所以它不会被子查询愚弄。您可能会发现,这两个查询的执行计划完全相同。
请注意,所有数据库都是这样工作的。然而,并非所有优化器都是相等的。因此,如果在MySQL (旧版本)或MS Access中使用子查询,则可能会发现性能上的显著差异。
https://stackoverflow.com/questions/59820526
复制相似问题