我最近遍历了很多SQL代码,其中Join部分充满了复杂的子查询,并开始想知道使用有限的列选择连接子查询与仅连接整个表并仅选择必要的列是否有任何好处。
要说明这一点:
比方说,我们有2个表:data model
,每个表都有列Table1, Table2
。
我想将Table1与Table2联接在一起,但是只从Table2中检索几个字段。
哪个更有效,每个都有什么好处?
(PK, FK, a, b ,c, d, e, f)
OR
SELECT
Table1.*,
Table2.a,
Table2.b
FROM Table1
LEFT JOIN Table2 ON Table1.PK = Table2.FK
答案 0 :(得分:3)
SQL是一种描述性语言,而不是 procedural 语言。也就是说,SQL查询描述的是结果集的外观,而不是结果的生成方式。
实际上,引擎运行的东西称为有向非循环图(DAG),它看起来完全不像查询。 SQL引擎首先解析查询,然后对其进行编译,然后对其进行优化以生成DAG。
SQL Server具有良好的优化程序。它不会被子查询所混淆。一些SQL编译器不够智能,会具体化子查询-这可能会对性能产生重大影响。
如果查看执行计划,您会发现在这种情况下它们是相同的。