Sql server 内部联接vs where子句子查询sql server
我试图加快存储过程的速度,所以我使用下面的统计io以两种格式测试存储过程 方法1:使用连接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(
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语句或一个查找,那么改为内联编写。