具有where和left联接的SQL子句的性能

具有where和left联接的SQL子句的性能,sql,left-join,where,database-performance,Sql,Left Join,Where,Database Performance,假设我有两张桌子,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 whe

假设我有两张桌子,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子句


谢谢

运行它们并查看查询计划
它甚至会给你一个估计时间的分割,这在某种程度上取决于你使用的是哪种RDBMS。然而,大多数人会将这两个查询解释为完全相同。您可以通过对两个查询运行解释计划来确定数据库中是否存在这种情况。如果计划是相同的,那么优化器已经正确地识别出这两个查询是等效的,并且为这两个查询提出了相同的计划


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

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