首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Server中,子查询是否自动优化?

在Server中,子查询是否自动优化?
EN

Stack Overflow用户
提问于 2020-01-20 09:42:05
回答 1查看 102关注 0票数 0

请不要理会我为什么这样写这个查询的原因,这不是问题的主题,因为这是一个从现实世界的例子中派生出来的假设。

我有一个案例,我需要通过分页检索记录:每页只有9条记录。

我有一个子查询,它从users表中检索所有行(> 10,000行),在信封查询中,我应用分页,如下所示:

代码语言:javascript
复制
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行,这当然会对性能产生负面影响,或者,它是否以某种方式优化了它,这样它就不必返回整个结果集,如果没有子查询,就会产生相同的性能吗?

我重写了这个查询,以便更直接,如下所示:

代码语言:javascript
复制
select firstname, lastname, age
from users
order by lastname asc
offset 0 rows fetch next 9 rows only

然而,令我惊讶的是,我并没有注意到性能有那么大的提高,这让我想到也许SQL Server在幕后是自己的优化吗?

有人有线索吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-20 13:26:15

SQL是一种描述性语言,而不是一种过程语言。SQL查询描述正在生成的结果。它没有指定如何计算这些结果。

这是编译器和优化器的功能。实际上,执行的代码与原始SQL语句完全不一样。从技术上讲,它被称为DAG (有向无圈图)。它使用了一堆你无法识别的原始运算符。通常很难找到原始查询中与特定操作符匹配的内容。

当Server执行查询时,将对整个查询进行优化。Server有一个很好的优化器,所以它不会被子查询愚弄。您可能会发现,这两个查询的执行计划完全相同。

请注意,所有数据库都是这样工作的。然而,并非所有优化器都是相等的。因此,如果在MySQL (旧版本)或MS Access中使用子查询,则可能会发现性能上的显著差异。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59820526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档