【问题标题】:SQL Server table or subquery for join?用于连接的 SQL Server 表或子查询?
【发布时间】:2018-09-25 09:52:35
【问题描述】:

我现在使用的是在 SQL Server 2012 上运行的相当神秘的 DB (SAP),只有 SELECT 权限,所以有些东西很难调试/优化。

我有一张大桌子'table1',还有一张小桌子'table2'、'table3'。百万行的大表会在where语句中过滤到最多100行

我必须从 table1 开始。你会推荐:

select fields 
from table1
left join table2 
left join table3
where table1.field1 = 'x' 
  and table1.field2 = 'y'

或者

Select 
    fields 
from
    (select fields 
     from table1 
     where table1.field1 = 'x' and table1.field2 = 'y') as t1
left join
    table2
left join
    table3

而且,为什么?我想更好地理解这一点。

谢谢!

【问题讨论】:

  • 是否有sql server?
  • 不要不必要地使用子查询。让优化器完成它的工作。
  • @scaisEdge SQL SERVER 2012
  • 如果您使用 sqlserver,那么在您的应用程序中对 SAP 的引用是什么意思?
  • @scaisEdge SAP 存储在 MSSQL 中,只是为了让您知道我只有 SELECT 权限,并且表、名称、索引不是自我解释的,有时很难理解。

标签: sql sql-server sql-server-2008


【解决方案1】:

理想情况下

select fields 
from table1
left join table2
left join table3
where table1.field1 = 'x' and table1.field2 = 'y'

此代码将首先连接所有表,然后应用 where 条件中提到的过滤器。

Select fields 
from
     (select fields 
      from table1 
      where table1.field1 = 'x' and table1.field2 = 'y') as t1
left join table2
left join table3

而此代码将首先根据过滤条件过滤表,将其加载到临时位置,然后才将过滤后的行连接到其他表。

如果 table1 有很多行,而满足过滤条件(低基数)的行很少,那么第二个代码会运行得更快。

如果过滤器没有减少多少行数,那么瓶颈将是代码 2 中加载到临时空间中,因为代码 1 可能更好

注意::此答案会根据您的 SQL 引擎和查询优化器而改变。许多优化器足够聪明,可以检测到在代码 1 中只需要连接过滤的行,因此在这种情况下,代码 1 会更好

【讨论】:

  • 谢谢,这是 SQL SERVER 2012
  • 查询优化器在不同版本中的工作方式不同,并且基于表、索引等的大小。尝试Explain 功能以了解执行计划。 stackoverflow.com/questions/3449814/…
  • 谢谢,无法查看此服务器上的执行计划,所以我想知道是否有一般规则或执行顺序来改进我所做的查询。
  • 好的,知道巨大的表(table1)有数百万行但在“WHERE”中最多会过滤100行,我知道最好的办法是过滤它使用子查询,然后进行连接
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-03
  • 2021-01-28
  • 1970-01-01
  • 1970-01-01
  • 2017-07-05
  • 1970-01-01
相关资源
最近更新 更多