Nan*_*dha 1 sql-server join where-clause logical-reads sql-execution-plan
我正在尝试加快我的存储过程,所以我使用下面的统计信息以两种格式测试我的存储过程
方法1:使用join
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
Run Code Online (Sandbox Code Playgroud)
我得到统计结果为
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.
Run Code Online (Sandbox Code Playgroud)
方法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)
Run Code Online (Sandbox Code Playgroud)
我得到统计结果为
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.
Run Code Online (Sandbox Code Playgroud)
需要知道哪一个最好用?
需要解释逻辑读取如何在这里工作?
如果你不需要assignvehicletouser
桌子上的任何东西,我宁愿EXISTS
(它的工作方式可能相同IN
)
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
WHERE EXISTS (
SELECT 1
FROM assignvehicletouser asn
WHERE asn.vehicleno = p.vehicleno
AND asn.empid = 1
);
Run Code Online (Sandbox Code Playgroud)