【问题标题】:performance for a SQL clause with where and a left join带有 where 和 left join 的 SQL 子句的性能
【发布时间】:2017-05-05 00:50:25
【问题描述】:

假设我有 2 张桌子,TblA 和 TblB。 TblA 每月有数百万条记录,而 TblB 有产品的详细信息。

哪个查询会更快:

select
    t1.*, t2.name
from 
    TblA as t1
left join 
    TblB as T2 on t1.idProduct = t2.idProduct
where 
    t1.month = 6

或者这个:

select 
    t1.*, t2.name
from 
    (select * from tblA where month = 6) as t1
left join 
    TblB as t2 on t1.idProduct = t2.idProduct

我的猜测是第二个会更快,因为我在进行左连接之前只预先选择了我想要的月份。

在进行左连接之前,数据库系统是否预先构建来处理 where 子句?

谢谢!

【问题讨论】:

  • 运行它们并找出答案?
  • 为什么不分别运行几次,看看哪个更快?
  • 到目前为止,我们的表中只有一个月。
  • 当你有更多的月份时,一个可能会突然跑得比另一个快。或者它们可能总是以相同的方式运行,因为查询计划器认识到它们是同一事物。看看并理解查询计划。
  • 您至少应该标记您正在使用的 DBMS(sql-server、oracle、mysql 等)。此外,几乎所有 rdbms 系统都有查询计划。使用查询计划不仅可以比较查询,还可以比较服务器选择执行它们的方式。在此基础上,您可以优化查询并创建可能对提高效率很有必要的索引对象。

标签: sql left-join where database-performance


【解决方案1】:

同时运行它们并查看查询计划
它甚至会给你一个估计时间的分裂

【讨论】:

    【解决方案2】:

    这在一定程度上取决于您使用的 RDBMS。但是,他们中的大多数人会将这两个查询解释为完全相同。您可以通过在两个查询上运行explain plan 来确定您的数据库中是否存在这种情况。如果计划相同,则优化器已正确识别出两个查询是等效的,并为两者提出了相同的计划。

    一般来说,SQL 不指定操作的顺序;它让优化器考虑所有选项并选择最佳选项。嵌套查询通常不会改变这一点 - 几乎所有优化器都会尽可能地扁平化您提供的查询。

    【讨论】:

      猜你喜欢
      • 2017-09-09
      • 2011-01-30
      • 1970-01-01
      • 2015-08-21
      • 1970-01-01
      • 1970-01-01
      • 2015-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多