Sql server 内部联接vs where子句子查询sql server

Sql server 内部联接vs where子句子查询sql server,sql-server,join,where-clause,sql-execution-plan,logical-reads,Sql Server,Join,Where Clause,Sql Execution Plan,Logical Reads,我试图加快存储过程的速度,所以我使用下面的统计io以两种格式测试存储过程 方法1:使用连接 set statistics io on select top 2000 p.Vehicleno, dbo.GetVehicleStatusIcon1(p.Direction, StatusCode, 0) as 'Status', location, Convert(varchar(13), p.TrackTime, 102) + ' ' + Convert(

我试图加快存储过程的速度,所以我使用下面的统计io以两种格式测试存储过程

方法1:使用连接

set statistics io on 

select top 2000   
    p.Vehicleno, 
    dbo.GetVehicleStatusIcon1(p.Direction, StatusCode, 0) as 'Status',
    location,
    Convert(varchar(13), p.TrackTime, 102) + ' ' + Convert(varchar(13), p.TrackTime, 108) AS 'TrackTime',
    p.Speed, p.Ignition
from 
    pollingdata p 
inner join 
    assignvehicletouser asn on asn.vehicleno = p.vehicleno
where 
    asn.empid = 1
我得到了统计结果

Table 'Worktable'. Scan count 943, logical reads 7671, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'AssignVehicleToUser'. Scan count 1, logical reads 41, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'PollingData'. Scan count 1, logical reads 50, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'PollingData'. Scan count 1, logical reads 50, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'AssignVehicleToUser'. Scan count 1, logical reads 41, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
方法2:使用where子句子查询

set statistics io on 

select top 2000 
    Vehicleno,
    dbo.GetVehicleStatusIcon1(Direction,StatusCode, 0) as 'Status',
    location,
    Convert(varchar(13), TrackTime, 102) + ' ' + Convert(varchar(13), TrackTime, 108) AS 'TrackTime',
    Speed, Ignition
from 
    pollingdata 
where 
    vehicleno in (select vehicleno 
                  from assignvehicletouser 
                  where empid = 1)
我得到了统计结果

Table 'Worktable'. Scan count 943, logical reads 7671, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'AssignVehicleToUser'. Scan count 1, logical reads 41, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'PollingData'. Scan count 1, logical reads 50, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'PollingData'. Scan count 1, logical reads 50, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'AssignVehicleToUser'. Scan count 1, logical reads 41, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
需要知道哪一个最适合使用吗

需要解释一下逻辑读取是如何工作的吗?

连接通常比内部查询工作得更快,但实际上它取决于SQL Server生成的执行计划

无论您如何编写查询,SQL Server都会在执行计划中对其进行转换

如果它足够聪明,可以从两个查询生成相同的计划,那么您将得到相同的结果

您可以阅读,通常联接比内部查询工作得更快,但实际上它将取决于SQL Server生成的执行计划

无论您如何编写查询,SQL Server都会在执行计划中对其进行转换

如果它足够聪明,可以从两个查询生成相同的计划,那么您将得到相同的结果


您可以阅读和

如果您不需要assignvehicletouser表中的任何内容,我希望它可能以与中相同的方式工作


若您不需要assignvehicletouser表中的任何内容,我希望它的工作方式与中的相同


根据提供的统计结果,第二个似乎更好,因为第一个具有额外的tempdb操作,用于保存临时/中间操作/结果,如排序操作

:每次从SQL server缓冲区缓存读取页面时都会发生逻辑读取,这很好

物理读取:当所需的数据页在缓冲区缓存中不可用时,系统会从磁盘物理IO读取数据页并将其复制到缓冲区缓存中

您可以使用交叉应用来加入UDF,而不是直接调用它。在第一个查询中,条件asn.emp=1可以在“ON”条件之后直接应用,如
asn.vehicleno=p.vehicleno和asn.empid=1

根据提供的统计结果,第二个似乎更好,因为第一个具有额外的tempdb操作,用于保存临时/中间操作/结果,如排序操作

:每次从SQL server缓冲区缓存读取页面时都会发生逻辑读取,这很好

物理读取:当所需的数据页在缓冲区缓存中不可用时,系统会从磁盘物理IO读取数据页并将其复制到缓冲区缓存中

您可以使用交叉应用来加入UDF,而不是直接调用它。在第一个查询中,条件asn.emp=1可以在“ON”条件之后直接应用,如
asn.vehicleno=p.vehicleno和asn.empid=1

始终建议在中使用联接。所以第一种方法最好。你能用逻辑解释一下吗reads@SridharDD这是十年前一直被推荐的。只需理解操作的含义-它是否是逻辑连接?您是否可以包括实际的查询计划?我猜它会退回到IN查询的半联接。您是否考虑过UDF dbo.GetVehicleStatusIcon1是性能瓶颈?这个函数有多复杂?它做什么?可以在SQL查询中内联编写它吗?如果它只是一个case语句或查找,请改为内联编写。始终建议在中使用联接。所以第一种方法最好。你能用逻辑解释一下吗reads@SridharDD这是十年前一直被推荐的。只需理解操作的含义-它是否是逻辑连接?您是否可以包括实际的查询计划?我猜它会退回到IN查询的半联接。您是否考虑过UDF dbo.GetVehicleStatusIcon1是性能瓶颈?这个函数有多复杂?它做什么?可以在SQL查询中内联编写它吗?如果它只是一个case语句或一个查找,那么改为内联编写。