2016-04-15 11 views
3

Mit SSMS, wie kann ich feststellen, welche Abfrage effizienter ist? Ich bevorzuge A, aber mir wird gesagt, dass die Unterabfrage für jede Zeile in Transmission einmal ausgeführt wird, und daher wird B bevorzugt.Wie ermittelt man, welche Abfrage in SSMS 2014 effizienter ist?

A

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') 

B

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 

EDIT: Dies ist die Statistik aus der Verwendung SET STATISTISCHE 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. 

B

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. 

Also, soweit ich das beurteilen kann, gibt es keinen Unterschied in der Effizienz.

EDIT 2: So bekomme ich es jetzt: Da die Unterabfrage keine correlated Unterabfrage ist, wird sie nur einmal ausgeführt. https://en.wikipedia.org/wiki/Correlated_subquery (Danke an @destination_data für den Link.)

+0

Bezieht sich der erste Schritt nicht immer auf EXPLAIN PLAN? –

+0

Ich schaue mir den Ausführungsplan an, aber mir ist aus den Daten nicht klar, welcher effizienter ist. –

+0

'Execution Plan/STATISTICS IO' sollte Ihnen helfen –

Antwort

2

Es würde erfordern, die tatsächlichen Ausführungspläne zu untersuchen, aber ich vermute, dass diese identisch sein werden. Diese Unterabfragen sollten nur einmal ausgeführt werden, da sie nicht korreliert sind und die Engine ziemlich gut darin ist, das Zeug zu sehen.

Wenn Sie wirklich in die Details gehen möchten, schauen Sie sich dieses kostenlose E-Book von Grant Fritchey an. https://www.red-gate.com/library/sql-server-execution-plans-2nd-edition

0

Ein Weg, um Abfragen in SSMS zu vergleichen:

In SSMS, sind beide Abfragen auf einem einzelnen Register. Wählen Sie das Menü Abfrage, und wählen Sie "Clientstatistiken einschließen"

Kommentieren Sie eine der Abfragen, und führen Sie dann die andere aus. Wählen Sie die Registerkarte "Client Statistics" und sehen Sie sich die Statistiken an.

Jetzt die andere Abfrage auskommentieren, die erste auskommentieren und erneut ausführen. Beide Statistiken werden auf der Registerkarte Client Statistics angezeigt, und Sie können leicht sehen, welche effizienter ist.

Verwandte Themen