使用SSMS,我如何確定哪個查詢更高效?我更喜歡A,但我被告知子查詢在Transmission中每行都執行一次,因此B是首選。如何確定哪個查詢在SSMS 2014中效率更高
甲
Update t set t.transmission_status_id =
(select transmission_status_id from transmission_status where code = 'TRANSLATED')
from transmission t
where t.transmission_status_id =
(select transmission_status_id from transmission_status where code = 'RECEIVED')
乙
declare @transmission_status_TRANSLATED INT = (select transmission_status_id from transmission_status where code = 'TRANSLATED')
declare @transmision_status_RECEIVED INT = (select transmission_status_id from transmission_status where code = 'RECEIVED')
Update t set t.transmission_status_id = @transmission_status_TRANSLATED
from transmission t
where t.transmission_status_id = @transmision_status_RECEIVED
編輯:這是統計使用SET STATISTICS ON:
A.
Table 'transmission_status'. Scan count 1, logical reads 2, physical reads 0,
read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'transmission_status'. Scan count 1, logical reads 2, physical reads 0,
read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'transmission'. Scan count 1, logical reads 778, physical reads 0,
read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
乙
Table 'transmission'. Scan count 1, logical reads 778, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'transmission_status'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
所以,據我所知,效率沒有差別。
編輯2:所以我現在得到它:由於子查詢不是correlated
子查詢,它只執行一次。 https://en.wikipedia.org/wiki/Correlated_subquery(感謝@destination_data的鏈接)
第一步是不是總是涉及'EXPLAIN PLAN'? –
我正在看執行計劃,但從數據中我不清楚哪一個更高效。 –
'執行計劃/ STATISTICS IO'應該對你有所幫助 –